2012-10-15 2 views
0

이벤트 소싱에 대해 추론하고 있으며 종종 닭고기 및 달걀 문제에 직면합니다. 이 문제를 해결하는 방법에 대한 힌트를 주셔서 감사드립니다.이벤트 소싱 : 모델을 업데이트하기 전이나 후에 이벤트를 작성하십시오.

모든 I/O 바인딩 처리를 비동기 적으로 (즉, 이벤트 로그에 기록하는 경우) 어떻게 처리합니까? 또는 때로는 감지 할 수 있습니까?

나는 각 이벤트/메시지에 대해 순차적으로 처리하도록 Akka Actors를 사용하고 있습니다. 지금은 데이터베이스가 없습니다. 대신 모든 이벤트를 이벤트 로그에 유지 한 다음 메모리에 저장된 모든 이벤트의 집계 된 상태를 유지합니다. 검색어는 모두이 모델과 대조되며 캐시라고 생각할 수 있습니다.

  1. 검증 사용자가 (메모리) 저널에 모델
  2. 지속 이벤트에
  3. 업데이트 모델을 존재하지 않는
:

새 사용자 만들기

3 단계가 중단되면 나중에 내 이벤트를 지속하므로 나중에 다시 재생할 수 있습니다. 2 단계가 깨지면 나는 그것을 우아하게 처리 할 수 ​​있습니다.

이, 하지만 2 단계는 I /이기 때문에 내가 쿼리에 대한 첫 번째 배우 확보하기 위해 별도의 배우에 I/O를해야한다고 생각 O 바인딩 괜찮 : 사용자 동안 업데이트

을 (A0 = 프런트 엔드/GUI 액터, A1 = 프로세서 액터, A2 = IO 액터, E = 이벤트 버스)를 허용합니다.

  1. (A0-> E-> A1) 사용자 'U1'을 (를) 업데이트하기 위해 이벤트가 게시됩니다. 검증은 사용자 U1 '는 모델에 있는지
  2. (A1-> A2) 저널 이벤트 지속 (별도 배우)
  3. (A0-> E-> A1-> A0) 쿼리 사용자'U1 '프로필
  4. (A2-> A1) 이벤트는 이제

모델에게

  • (A0-> E-> A1-> A0) 쿼리는 사용자에 대한 'U1'프로필 (현재 반환 새 데이터)를 업데이트 계속 유지됩니다 I/O가 자신의 페이스대로 진행되는 동안 쿼리를 처리 할 수 ​​있으므로 매력적입니다.

    하지만 이제는 유효하지 않은 두 가지 명령 (삭제 및 업데이트)을 이벤트 로그에 유지하고 나중에 재생할 때 충돌이 발생할 수있는 모든 종류의 문제가 발생할 수 있습니다. 이벤트를 지속시킨 다음 모델을 업데이트하십시오.

    내 목표는 (모델이 단일 스레드로 순차적으로 메시지를 처리하므로) 쿼리 할 때 I/O 바인딩 업데이트를 기다리지 않고 내 모델 주위에 간단한 추론을하는 것입니다. 그 자체로 문제가 될 수있는 데이터베이스를 모델링하는 느낌을 갖습니다.

    내용이 명확하지 않은 경우 의견을 남기십시오.

  • +0

    모델 변경 사항을 커밋하거나 모델을 업데이트하고 이벤트를 게시하지 않고 이벤트를 게시하지 않는다는 것을 알고있는 한 중요하지 않습니다. 많은 프레임 워크는 MSDTC를 사용하여 NServiceBus를 비롯한 이러한 종류의 트랜잭션 컨텍스트를 제공하지만이를 구현하는 다른 방법이 있습니다. 아무도 실제로 그에 대한 구체적인 답을 줄 수는 없지만 실제로 현재 인프라에 따라 다릅니다. – Marco

    답변

    0

    비동기 I/O는 트랜잭션 업데이트와 함께 사용할 수 있습니다. 명령 뒤에 "ACK"또는 "NACK"을 전송하면 문제가 발생했는지 여부를 알 수 있습니다.분산 형 또는 진정한 비동기식 모델에서는 "NACK"이 명시 적 오류와 시간 초과로 인해 발생할 가능성이 큽니다.

    +0

    Windows 시스템에서 MSDTC를 사용하여 트랜잭션을 올바르게 조정해야한다는 의미입니까? OP와 관련하여 진정한 asyn 환경의 명령은 FIFO 대기열로 끝납니다. 따라서 동일한 바구니에 asyn 명령 컨텍스트에서 트랜잭션을 맞추고 모델을 업데이트하는 방법을 잘 모르겠습니다. 모델에서 업데이트를 그룹화하는 트랜잭션과 나가는 큐에서 생성되는 이벤트를 이해할 수는 있지만 명령은 이해할 수 없습니다. – Marco

    관련 문제