2014-11-05 5 views
1

제공 핸들러 내의 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의이 처리 될 때까지이 메시지가 큐에 추가됩니다.

답변

2

몇 가지 테스트를 거친 후에 나는 진짜 문제가 없다고 말할 수 있습니다. 난 당신이 동시성 - 예외 (이 예외가 기록됩니다) 해결할 수 없다고 생각하지만,이 예외가 발생하면, 메시지는 단지 재 시도를 위해 대기열로 다시 전송됩니다.

핸들이 두 번 실행되지만 두 번 실행되는 것이 두려웠지만 트랜잭션이 활성화 되었기 때문에 추측됩니다. 예를 들어, 하나의 동작은 다른 버스에 메시지를 보내 이벤트를 지속시키는 것입니다 (페리 스터 큐). 이 조치는 예외가 발생하기 전에 호출됩니다 (핸들, Saga에 데이터가 저장되고 예외가 발생 된 후에). 그러나 persister-queue에 메시지가 추가되지 않았습니다. 성공한 메시지를 다시 시도한 후에 (더 이상 동시성 - 예외가 없도록 Data를 업데이트 함) persister-message가 persister-queue에 추가됩니다.

결론 : 실제 문제는 아니며 로그 파일에 여분의 줄이 있습니다.

+1

실제로. workerthread가 두 개 이상있는 경우 두 개 이상의 스레드가 동일한 사가에서 동시에 작업하려고 할 가능성이 있습니다. 하나만 성공하고 다른 하나는 다시 시도됩니다. 이러한 종류의 간헐적 인 "실패"는 NServicebus에서 기본 제공되는 재시도 지원의 주된 이유 중 하나입니다. – janovesk