제공 핸들러 내의 MessagePart에 추가되는 MessagePart ConfirmMessage는 특정 MessagePart의 상태를 업데이트합니다.NServiceBus 사가 우리는 여러 메시지 유형을 처리하는 NServiceBus 구현이 동시성 예외
1) 첫 번째 CreateMessage가 수신됩니다. 이것은 Raven에서 Saga를 만들고 MessagePart에 MessagePart (상태 "1")를 추가합니다.
2) 첫 번째 ConfirmMessage가 수신됩니다. Saga에서 처음 추가 된 MessagePart의 Status가 "1 2"로 업데이트됩니다. 이것은 RavenDB에서 문서로 갈 때 브라우저에 표시됩니다.
3) 두 번째 CreateMessage가 수신되었습니다. 그러면 MessagePart에 두 번째 MessagePart가 추가됩니다. 데이터로 보면, 첫 번째 MessagePart의 상태는 여전히 "1"이 아니라 "1 2"그리고 이것은 동시성 예외합니다 (ActualETag가 ExpectedETag 동일하지 않음)가 발생합니다 :
A first chance exception of type 'Raven.Abstractions.Exceptions.ConcurrencyException' occurred in Raven.Client.Lightweight
Additional information: PUT attempted on document 'flow/79a7ee20-f090-4648-9b62-a3da00d87c93' using a non current etag
이 모습을 사가 - 데이터는 메시지 유형마다 캐시됩니다. 이거 뭡니까? 해결책이 있습니까?
참고 :
우리는 여러 IAmStartedByMessages를 사용하고 있지만, confirmMessage를가 createMessage의 앞에있을 때, createMessage의이 처리 될 때까지이 메시지가 큐에 추가됩니다.
실제로. workerthread가 두 개 이상있는 경우 두 개 이상의 스레드가 동일한 사가에서 동시에 작업하려고 할 가능성이 있습니다. 하나만 성공하고 다른 하나는 다시 시도됩니다. 이러한 종류의 간헐적 인 "실패"는 NServicebus에서 기본 제공되는 재시도 지원의 주된 이유 중 하나입니다. – janovesk