You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

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

무수히 발생하는 이벤트로 인해 우리가 설계한 어떠한 객체의 상태는 지속적으로 변경된다는 점이며

이벤트소싱이 과거 이벤트의 재생을 하여 상태를 복원하는반면, 스냅샷은 특정시점의 상태를 기록함으로 복구를 하는개념입니다.

각각 다른 기술이 베타적으로 사용될수도 있고, 혼합되어 사용될수도 있습니다.

우리 리얼세상과 연관을 한다고 하면, 사물(식물의 변화과정이라고 합시다.)의 변화 사항을 

일정한 주기로 항상 사진을찍었으며(스냅샷)  필요한 시점의 식물의 몇가지 상태를 알수가 있습니다.-물론 리얼세계의 물질을 복원하는것은 SF에서가능합니다.

그리고 최근몇개월간의 자료만 유지함으로 최근데이터를 보존함과 동시에 공간낭비를 줄일수가 있습니다.


스냅샷 구현

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();
}

스냅샷 저장에 필요한 메타정의(SnapshotMetadata) 후 자신이 원하는 타이밍에

카메라 셔터(saveSnapshot) 를 누르기만 하면됩니다.


스냅샷 복원

private Object state;

@Override public Receive createReceiveRecover() {
  return receiveBuilder().
    match(SnapshotOffer.class, s -> {
      state = s.snapshot();
      // ...
    }).
    match(String.class, s -> {/* ...*/}).build();
}


또는


@Override
public Recovery recovery() {
  return Recovery.create(
    SnapshotSelectionCriteria
      .create(457L, System.currentTimeMillis()));
}

마지막 상태를 복원(SnapshotOffer)할수도 있고,

각 시간대별 스냅샷은 고유 아이디가 존재함으로

특정 스냅샷(SnapshotSelectionCriteria)을 복원할수도 있습니다.


스냅샷 시도에따른 반응 메시지

MethodSuccessFailure message
saveSnapshot(Any)SaveSnapshotSuccessSaveSnapshotFailure
deleteSnapshot(Long)DeleteSnapshotSuccessDeleteSnapshotFailure
deleteSnapshots(SnapshotSelectionCriteria)DeleteSnapshotsSuccessDeleteSnapshotsFailure

스냅샷은 다양한 이유로(디스크풀및 메모리풀등) 실패가 있을수 있으며

그에 대응하는 코드작성도 가능합니다. 





  • No labels