Versions Compared

Key

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

...

Event Driven은 Eventsourcing을 하기 위한 선행과제이며 이것만 으로 큰 주제 이기 때문에 아래링크를 참고합니다포함하여 다양한 자료를 보시는것을 권장합니다. 

참고링크:

이벤트드라이븐이벤트드리븐(한글자료)

이벤트드라이븐이벤트드리븐(영문자료)

EventSourcing

메시지설계

Code Block
languagejava
themeEmacs
class Cmd implements Serializable {
    private static final long serialVersionUID = 1L;
    private final String data;

    public Cmd(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }
}


class Evt implements Serializable {
    private static final long serialVersionUID = 1L;
    private final String data;

    public Evt(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }
}

class ExampleState implements Serializable {
    private static final long serialVersionUID = 1L;
    private final ArrayList<String> events;

    public ExampleState() {
        this(new ArrayList<>());
    }

    public ExampleState(ArrayList<String> events) {
        this.events = events;
    }

    public ExampleState copy() {
        return new ExampleState(new ArrayList<>(events));
    }

    public void update(Evt evt) {
        events.add(evt.getData());
    }

    public int size() {
        return events.size();
    }

    @Override
    public String toString() {
        return events.toString();
    }
}

...

Code Block
languagejava
themeEmacs
	protected void persistenceEventSrc(ActorSystem system,SpringExtension ext)  {
	    new TestKit(system) {{
	    	ActorRef probe = getRef();	    	
	    	
			Props examplePersistentActor = ext.props("examplePersistentActor");
			
			System.out.println("eventActor 액터생성");
			ActorRef eventActor = system.actorOf(examplePersistentActor, "eventActor");
			
			System.out.println("event 생성");
			eventActor.tell(new Cmd("test1"), ActorRef.noSender());
			eventActor.tell(new Cmd("test2"), ActorRef.noSender());
			eventActor.tell(new Cmd("test3"), ActorRef.noSender());
			eventActor.tell(new Cmd("test4"), ActorRef.noSender());
			
			System.out.println("event 재생");
			eventActor.tell( "print" , ActorRef.noSender());			
			expectNoMessage(java.time.Duration.ofSeconds(1));
			
			System.out.println("eventActor 종료또는 비정상종료");
			eventActor.tell( akka.actor.PoisonPill.getInstance() , ActorRef.noSender());			
			expectNoMessage(java.time.Duration.ofSeconds(1));
			
			System.out.println("eventActor 재생성");
			ActorRef eventActor2 = system.actorOf(examplePersistentActor, "eventActor");
			
			System.out.println("event 복원확인");
			eventActor2.tell( "print" , ActorRef.noSender());
			
			expectNoMessage(java.time.Duration.ofSeconds(1));
				        
	    }};
	}

이벤트 소싱의 Flow를 간단하게 확인할수 있는 TestCode입니다.

특정한 기능 목적을 두지는 않았지만, 장바구니에 활용될수 있으며 예를 들면  장바구니를 담고뺀 순서를 알수 있으며

...

Expand
title실행결과

[INFO] [06/11/2018 10:37:26.066] [main] [akka.persistence.Persistence(akka://AkkaTestApp)] Auto-starting journal plugin `akka.persistence.journal.inmem`
[INFO] [06/11/2018 10:37:26.083] [main] [akka.persistence.Persistence(akka://AkkaTestApp)] Auto-starting snapshot store `akka.persistence.snapshot-store.local`
eventActor 액터생성
event 생성
event 재생
[test1-0, test2-1, test3-2, test4-3]
eventActor 종료또는 비정상종료
eventActor 재생성
event 복원확인
[test1-0, test2-1, test3-2, test4-3]

이벤트 소싱의 Flow를 간단하게 확인할수 있는 TestCode입니다. 특정한 기능 목적을 두지는 않았으며

이 코드는 장바구니에 그대로 활용될수 있으며,  장바구니에 상품을 담고뺀 순서를 알수 있으며( 장바구니의 이벤트를 기록및 재생)

마지막 장바구니에 담긴 물건의 최종상태도 알수가 있습니다.( 이것을 어떻게 서비스할지는, 이벤트를 소비하는 서비스의  역활  )

필요에 따라 분산된 저장소에 확장이 가능합니다.   


참고자료: