Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

스냅샷은 앞장 이벤트소싱에서도 부분적으로 사용이되었습니다. 스냅샷은 다양한곳에서 사용될수 있으며 그 컨셉은 간단합니다.

무수히 발생하는 이벤트로 인해 우리가 설계한 어떠한 객체의 상태는 지속적으로 변경된다는 점이며복원관점에서 연속된 이벤트 재생이 필요하며 이벤트자체를 모두 기록하는것과

상태를 기록하는 범위와 주기에따라 세가지로 구분되며, 그 차이를통해 스냅샷을 이해할수가 있습니다.

  1. 상태복원은 연속된 이벤트 재생만을 통해가능하며 리플레이와같은 구현을 위해 이벤트 자체를 모두 기록해야하는것과
  2. 모든 이벤트를 기록할필요없이 특정시점의 상태를
복원하기위해
  1. 복원을 하면되기 때문에,
주기적으로 상태를
  1. 원하는 만큼
찍는것입니다.

주로 게임 리플리와같이 게임시작부터 종료까지 게임플레이를 재생하려면 모든 상태보다 발생 이벤트를 기록해야하며

장바구니기능과 같이넣고빼고한 모든것을 기록할 필요없이 마지막 정보인 특정시점의 상태를 기록하는것이 이점입니다.

게임의 경우 고용량의 영상소스없이 재생이 가능하게되며, 언제든 원하면 고해상도의 동영상 제작도 가능해집니다.

장바구니의 경우 마지막 장바구니는 구매시 활용하고 특정시점의 장바구니는 다양한 상품 추천의 근거자료로 사용될수 있습니다. 

모두를 기록해야하나? 특정시점을 기록해야하냐? 저장소(DB)를 포함하여 IT전반적으로 고민하고 선택하는 주제이며

Redo와 Snapshot의 차이로 일반적으로 많이 언급되며 여기서 오라클을 붙인다던지, 이전작업을 복원하는 redo task 를 붙인다던지

다양한 연관 주제에대해 접근이 가능합니다. 

연관 키워드 : difference between redo and snapshot 

AKKA에서 스냅샷의 의미

액터를 통해 수많은 실시간 메시지(이벤트)가 발생하며, 그 메시지는 상태를 수없이 변경을 합니다.

어떠한 기능을위해 그 상태 변경을 우리가 의도한 만큼 저장을 하고 복원을 할수가 있습니다.

...

  1. 사진을 찍는 스냡삽과 같은 장치입니다.
  2. 마지막 값 유지만 보장됨으로, 왜 변경되었고 바로 이전으로 돌리는것은 불가능합니다.

연관 키워드 : difference between redo and snapshot


스냅샷 구현

Code Block
final case class SnapshotMetadata(persistenceId: String, sequenceNr: Long, timestamp: Long = 0L)


private Object state;
private int snapShotInterval = 1000;

// 스냅샷을 지원하는 메시지 정의
@Override public Receive createReceive() {
  return receiveBuilder().
    match(SaveSnapshotSuccess.class, ss -> {
      SnapshotMetadata metadata = ss.metadata();
      // ...
    }).
    match(SaveSnapshotFailure.class, sf -> {
      SnapshotMetadata metadata = sf.metadata();
      // ...
    }).
    match(String.class, cmd -> {
      persist( "evt-" + cmd, e -> {
        updateState(e);
        if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0)
          saveSnapshot(state);
      });
    }).build();
}

...