2017-02-14 1 views
0

나는 처음 Lagom + CQRS/이벤트 소싱 접근 그리고 난 같은 동작을 구현하고 싶습니다 :Lagom에서 "만료 후"부작용을 구현하는 방법은 무엇입니까?

  1. 서비스 호출이 (A REST API 호출을 통해 예를 들어) 실행
  2. 을 명령이 실행되고 상태를 변경시키는 이벤트를 트리거합니다 (예 : 어떤 종류의 타이머를 시작 함).
  3. 미리 정의 된 간격 후에 타이머가 만료되어 타이머를 무효화하기 위해 상태를 변경하기 위해 새 이벤트를 트리거해야합니다 (다른 외부 명령없이).

처음 두 단계는 간단하지만 TimerStartedEvent를 트리거하고 상태를 변경하면 고정 된 시간이 지나면 일정을 어떻게 "예약합니까"? 세 번째 단계는 어떻게 구현합니까?

+0

개인적으로 Lagom에 익숙하지 않지만 태그에 Akka를 표시 한 이후로 나는 귀하의 상황에 해당하는 경우 Akka Scheduler가 귀하의 Actor에게 시간 초과 메시지를 예약하도록 제안합니다. 작년에 작곡 한 작업 오케스트레이션 응용 프로그램에서 동작이 비슷합니다. REST API를 호출합니다. REST API가 완료되면 Completed 작업이 트리거되어야하지만 동시에 REST 호출은 Akka Scheduler를 사용합니다 타임 아웃 메시지를 예약합니다. 어느 쪽이 먼저 타겟 액터로 들어 왔는지에 따라 해당 호출이 종료 된 방법을 정의했습니다. – MattEdge

+0

@MattEdge 그건 좋은 생각입니다! Lagom은 Akka 위에 구축되어 있으므로 태그에 나열했습니다. 유일한 "단점"은이 외부 서비스가 첫 번째 서비스에 대한 일부 API를 호출하여 제한 시간을 통신해야하므로 CQRS 조건에서 상태를 변경하는 이벤트를 트리거하는 명령을 실행해야한다는 것입니다. 그것은 "올바른"방법입니까, 아니면 이벤트가 외부의 특정 명령없이 생성되어야합니까? –

+0

결과가 REST API를 통해 관련 액터로 라우트 된 후 내부적으로 이벤트가 생성되어 해당 액터가 재생성되었습니다. 그러나 시간 초과가 먼저 발생하면 액터가 종료되고 API가 적절한 액터를 쿼리 할 수 ​​없습니다 (우리는 추적을 위해 로그 아웃했습니다). – MattEdge

답변

0

실현 가능성 (실제로는 online-auction-scala sample code 자체)을 발견했습니다.

Lagom은 Akka 위에 구축 되었기 때문에 ActorSystem을 주입하므로 나중에 system.scheduler.schedule 호출을 사용하여 일정을 예약 할 수 있습니다.

system.scheduler.scheduler(offset, delay) { 
    checkFinishBidding() 
} 

checkFinishBidding() = { 
    registry.refFor[Entity](id).ask(SomeCommand) 
} 

그래서 시간 화재, 당신은 레지스트리에서 엔티티 심판 큐에서 단지 정상과 같은 명령을 실행할 수 있습니다

이 질문의 CQRS 부분에 대답하기 위해, 샘플 코드 같은 무언가를 서비스 호출.

+0

이것은 좋은 해결책이지만주의해야 할 사항이 있습니다. 온라인 경매 앱의 예제 코드는 아직 클러스터를 인식하지 못합니다. 즉, 여러 노드에서 서비스를 실행하면 (복원성 권장) 예약 된 작업이 모두 실행됩니다. 이를 방지하려면 Akka [Cluster Singleton] (http://doc.akka.io/docs/akka/2.4/scala/cluster-singleton.html)을 사용할 수 있습니다. –

+0

또한, 당신이 행복하다면 당신 자신의 대답을 받아 들일 수 있다고 생각합니다. :) –

관련 문제