2

CQRS 응용 프로그램에서 Event Sourcing을 사용하지 않아서 읽기 저장소를 업데이트 할 수있는 간단한 이벤트 로그를 소개했습니다.이벤트 소싱이없는 CQRS : 이벤트 로그 오류 처리

  • 쓰기 모델 상태 업데이트, 예를 들면 :

    내 응용 프로그램에 대한 상태 변경은 두 가지 작업으로 구성되어 있음을 의미한다 SQL INSERT
  • 삽입 이벤트로 이벤트는

모두 작업이 하나 개의 원자 작업으로 발생해야 쓰기 로그인합니다. 불행히도 이벤트 로그는 다른 데이터베이스 내에 있으므로 분산 트랜잭션에 대해 생각해야합니다.

대부분의 CQRS 샘플은 사가 패턴을 처리하며 이벤트 소싱을 사용하는 것으로 보입니다. 따라서 이벤트가 훨씬 간단 해집니다.

내 문제는 '완료되었습니다'상태 변경입니다. 예 :

SQLTransaction.Commit(); // if this fails, all is fine. Nothing to revert 
try 
{ 
    EventLog.Insert(event); 
} 
catch(Exception ex) 
{ 
    // Try to undo the SQL stuff. 
    CompensatingSQLTransaction().Commit(); 
    // uh-oh! The commit fails!! 

    // What now? Do a Retry? 
} 

도울 수있는 개념이 있습니다

  • SQL 삽입
  • 이벤트 로그 삽입 나는 보상 SQL 작업 (의사 코드)와 함께 올 수

실패 성공 나 밖으로? 내가 아웃 - 오브 - 동기화 읽기 데이터베이스를 방지하기 위해 다음과 같은 시나리오에 대해 생각 : 읽기 측 복제가 처리되지 않은 이벤트를 감지하면

  • 각 이벤트는 일련 번호
  • 있다 (예는, 40 수신 42), 이벤트 로그 41에서 이벤트 41을 조회합니다.
  • 이벤트 41을 사용할 수없는 경우 시스템은 누군가가 자세히 살펴볼 때까지 이벤트 복제를 중지합니다.

이 작업은 수동 유지 관리가 필요하지만 읽기 db의 동기화가 끊어지는 것을 방지합니다.

실생활 경험이 있습니까?

+0

분산 시스템이란? 얼마나 탄력/확장 성을 원하십니까? –

+0

한 달에 약 10 억 또는 2,000 만 개의 이벤트를 처리 할 수 ​​있어야합니다. 버스 시스템에 연결된 명령 및/또는 이벤트를 처리하는 여러 노드를 활용할 수 있어야합니다. 따라서 이벤트 복제는 여러 노드에서 발생할 수 있습니다. – mbnx

답변

4

두 쓰기 작업은 모두 하나의 원자 작업으로 수행되어야합니다.

이 시점에서 제기해야 할 중요한 질문이 있습니다. 왜? 원격 이벤트 로그가 기록부와 동기화되지 않은 경우 비즈니스 비용은 얼마입니까?

동기화가 필요하지 않은 경우, 이벤트 로그의 사본을 쓰기 모델과 동일한 데이터베이스에 저장하는 것이 좋습니다. Udi Dahan은이 접근 방법을 Reliable Messaging Without Distributed Transactions에 설명합니다. 쓰기 트랜잭션이 성공한 후 SQL 스토어의 이벤트를 원격 이벤트 로그에 복제 할 수 있습니다.

이렇게하면 원격 이벤트 로그가 항상 상태와 일치하지만 현재까지 따라 잡을 수는 없습니다.

일반적으로 충분합니다.; 결국 이벤트 로그 자체는 과거의 스냅 샷이며 이벤트 로그의 표현이 소비자에게 복사되는 동안 기록부는 변경 될 수 있습니다.

그러나 그렇게하지 않으면 허용되는 손상을 제공하는 분산 트랜잭션 엔진을 찾거나 원격 쓰기가 실패 할 경우 sagas를 사용하여 로컬 저장소에 대한 변경 사항을 실행 취소해야합니다.

차례로 Caitie 맥카프리의 2015 talk on sagas in distributed systems는,이 시점 제기 참조하는 saga pattern in aws

얀 쿠이 교수의 토론, 상기 보상 작업 또한 우리가 의미하는 성공 때까지 다시 시도 할 수 있어야하므로 실패 할 수 있기 때문에

을 그들은 멱등수가되어야합니다.

실제적으로 no. 당신이 인간의 개입을 경고하기 전에

그래, 다시 시도하십시오.

+0

로컬 이벤트 로그에 대한 아이디어가 정말 마음에 듭니다. 내 요구 사항에 충분할 것입니다. 고맙습니다! – mbnx

관련 문제