Page History
Info |
---|
스냅샷은 앞장 이벤트소싱에서도 부분적으로 사용이되었습니다. 스냅샷은 성능상의 목적으로 다양한곳에서 혼합되어 사용될수 있으며 그 컨셉은 간단합니다. 무수히 발생하는 이벤트로 인해 우리가 설계한 어떠한 객체의 상태는 지속적으로 변경된다는 점이며 모든 상태변화를 기록하는것은 불필요할수도 있으며, 필요한 순간의 청사진만 찍어서 그것을 활용할수 있다란 것입니다. 상태를 기록하는 범위와 주기에따라 세가지로 구분되며, 그 차이를통해 스냅샷을 이해할수가 있습니다.
AKKA에서의 스냅샷은 실시간 메시지 모든것을 이벤트 모두를 저장해야 요구와, 중요한 1최근 몇건은 꼭 저장해야 하는 Persitence 각기 다른 요구 요건에서 중간쯤에 위치하여 조율을하는 장치로 활용할수가 있습니다. 예를 들어 최근 이벤트 100개를 유지하는것과 ( 순수 Persist기능) 1000번째마다 스냅샷을 찍어서 100개를 유지하는것은 각각 요구하는 성능이 다르며 다른 목적으로 활용이 될수가 있으나 함께 작동한다란것입니다. 연관 키워드 : difference between redo and snapshot |
...
Code Block | ||||
---|---|---|---|---|
| ||||
@Component @Scope("prototype") public class SnapShotActor extends AbstractPersistentActor { private final LoggingAdapter log = Logging.getLogger(getContext().system(), "AbstractPersistentActor"); private Object state; private int snapShotInterval = 5; private int msgCnt = 0; @Override public String persistenceId() { return "ExamplePersistentActor-id-1"; } @Override public Receive createReceiveRecover() { return receiveBuilder(). match(SnapshotOffer.class, s -> { state = s.snapshot(); //상태복원 log.info("상태복원"); // ... }). match(String.class, s -> {/* ...*/}).build(); } @Override //복구전략(스냅샷을 무시할수도 있음) public Recovery recovery() { return Recovery.create(SnapshotSelectionCriteria.none()); /* return Recovery.create( SnapshotSelectionCriteria .create(457L, System.currentTimeMillis()));*/ } // 스냅샷을 지원하는 메시지 정의 @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 -> { log.info("EventFired:"+cmd); if(cmd.indexOf("print") ==0 ) { log.info("상태확인:"+state); }else { msgCnt++; if (msgCnt % snapShotInterval state == 0cmd ) { + "을 먹은 상태"; //이벤트가커멘드에따른 ?회 발생할때마다,상태를 변경하고 스냅샷을 찍음 ( 테스트를 위한 임의 조건) 상태변화 if (msgCnt % snapShotInterval == 0 ) { state = cmd + "을 먹은 상태";//이벤트가 ?회 발생할때만 스냅샷을 찍음 ( 스냅샵이 없을시 유실될수있습니다. ) log.info("SaveSnapShot:" + state); saveSnapshot(state); } } }) .build(); } } |
이벤트를 받게되면, 상태가 변경되게되며 자신이 원하는 타이밍에
카메라 셔터(saveSnapshot) 를 누르기만 하면됩니다.
여기서는 수많은 이벤트를 모두 저장하는것은 비효율적이니, 매 5번째 상태의 스냅샷정보를 유지하기로 하였다고 가정하였습니다.
실제, 앞장 샘플에서는 persist기능과 연동되어 스냅샷과 상관없이 최근 X개 유지기능을 통해 , 마지막 상태복구가가능합니다.
스냅샷 복원
Code Block | ||||
---|---|---|---|---|
| ||||
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())); } |
...