이벤트 프로세서 강제 실행실패한 Azure 이벤트 허브 이벤트 Data를 IEventProcessor에 다시 전달할 호스트입니다.프로세스 이벤트 메서드
응용 프로그램은 을 사용합니다.NET 4.6.1 및 마이크로소프트.Azure. 서비스 버스.이벤트 프로세서호스트 nuget 패키지 v2.0.2 및 종속성 Windows Azure.Azure 이벤트 허브 메시지를 처리하기 위한 ServiceBus 패키지 v3.0.1.
응용 프로그램에 다음이 구현되어 있습니다.IEventProcessor
처리되지 않은 예외가 에서 던져졌을 때ProcessEventsAsync
메소드 더EventProcessorHost
실행 중인 인스턴스에 해당 메시지를 다시 보내지 않습니다.IEventProcessor
(호스팅 응용 프로그램이 중지되었다가 다시 시작되거나 임대가 손실되었다가 다시 얻은 경우 다시 전송됩니다.)
예외를 초래한 이벤트 메시지를 강제로 재전송할 수 있는 방법이 있습니까?EventProcessorHost
에게IEventProcessor
구현?
거의 동일한 질문에 대한 이 설명에 가능한 한 가지 해결책이 제시되어 있습니다. 바로 IEventProcessor에서 처리되지 않은 EventHub 메시지 다시 전달입니다.프로세스 이벤트 동기화
이 의견은 마지막으로 성공적으로 처리된 이벤트 메시지의 복사본을 보유하고 다음에서 예외가 발생할 때 해당 메시지를 사용하여 명시적으로 체크포인트를 지정할 것을 제안합니다.ProcessEventsAsync
그러나, 그러한 솔루션을 구현하고 테스트한 후,EventProcessorHost
여전히 재전송하지 않습니다.구현은 매우 간단합니다.
private EventData _lastSuccessfulEvent;
public async Task ProcessEventsAsync(
PartitionContext context,
IEnumerable<EventData> messages)
{
try
{
await ProcessEvents(context, messages); // does actual processing, may throw exception
_lastSuccessfulEvent = messages
.OrderByDescending(ed => ed.SequenceNumber)
.First();
}
catch(Exception ex)
{
await context.CheckpointAsync(_lastSuccessfulEvent);
}
}
실행 중인 사항에 대한 분석:
로그 샘플의 일부는 https://gist.github.com/ttbjj/4781aa992941e00e4e15e0bf1c45f316#file-gistfile1-txt 에서 확인할 수 있습니다.
TLDR: 실패한 이벤트 배치를 에 재생할 수 있는 유일한 신뢰할 수 있는 방법은 다음을 사용하여 즉시 (일명)하는 것입니다.eph.UnregisterEventProcessorAsync()
또는 상황에 따라 프로세스를 종료합니다.이것은 다른 사람들을 허락할 것입니다.EPH
이 파티션의 리스를 획득하고 이전 체크포인트에서 시작하는 인스턴스입니다.
이것을 설명하기 전에 - 저는 이것이 훌륭한 질문이라는 것을 강조하고 싶습니다. 그리고 정말로, 우리가 해야 했던 가장 어려운 디자인 선택 중 하나였습니다.EPH
제가 보기에, 그것은 절충적인 b/w였습니다.usability
/supportability
의EPH
프레임워크, vs.Technical-Correctness
.
이상적인 상황은 다음과 같습니다.사용자가 코드를 입력할 때IEventProcessorImpl.ProcessEventsAsync
예외 발생 -EPH
도서관은 이것을 잡아서는 안 됩니다.이걸 그냥 놔뒀어야 했어요Exception
충돌시킵니다.crash-dump
는 명하게보다니줍여확▁the▁shows를 명확히 보여줍니다.callstack
책임지는.나는 여전히 믿는다 - 이것이 가장.technically-correct
해결책
현재 상황:의 계약.IEventProcessorImpl.ProcessEventsAsync
API &EPH
즉,
- 긴
EventData
EventHubs 서비스에서 수신할 수 있습니다. 사용자 콜백을 계속 호출합니다.IEventProcessorImplementation.ProcessEventsAsync
)와 함께 께함와께EventData's
할 경우, : " " " " " "EventProcessorOptions.ExceptionReceived
. - 내사자코 내부의
IEventProcessorImpl.ProcessEventsAsync
하고 모든오를통합야니다해합고처리를 통합해야 합니다.Retry's
필요에 따라EPH
사용자에게 처리 시간을 완전히 제어할 수 있도록 이 콜백에 대한 시간 초과를 설정하지 않습니다. - - 특정이원문인경 - 표시
EventData
속성 - ="type" (예: type=)poison-event
동일한 한주재전송로로 다시 .EventHub
사건에 합니다.)EventData.Offset
그리고.SequenceNumber
EventData.ApplicationProperties
) 또는 SERVICEBUS 큐에 저장하거나 다른 곳에 저장합니다. 기본적으로 포이즌 이벤트를 식별하고 처리를 연기합니다. - 만약 , 은 바로 당신의 문제입니다.
Exceptions
& shutdown 캐치앤운다셧.EPH
또는failfast
이 예외가 있는 프로세스그 때.EPH
다시 올라옵니다. 왼쪽부터 시작합니다.
체크포인트 '이전 이벤트'가 작동하지 않는 이유는 무엇입니까(자세한 내용은 여기를 참조하십시오.EPH
일반적으로):
막후서에.EPH
는 EventHub . 를 특정 EventHub Consumer group에서 을 수행합니다. 수신기를 특정 위치에서 시작하는 작업을 수행합니다.checkpoint
) 의를 생성합니다.IEventProcessor
후 구현후receive
된 EventHub 파티션에서 합니다.Offset
경우 - 검소존서에경우않는지하재문존▁(▁-경▁in우서▁the않▁(는 -)EventProcessorOptions.initialOffsetProvider
을 실행하고 에는 )을 실행합니다.IEventProcessorImpl.ProcessEventsAsync
의 은?Checkpoint
할 수 입니다.EPH
으로 이동됩니다.EPH
예를 들면그렇게,checkpoint
펌프를 시동할 때만 소모되며, 펌프가 시동되면 판독되지 않습니다.
글을 제가이글을쓰서면,서▁this면쓰▁as▁i,글을,EPH
버전 2.2.10입니다.
간단한 답변: EventProcessorHost를 사용해 보셨습니까?연결 재설정(string partitionId)?
복잡한 답변:최종적으로 해결해야 할 아키텍처 문제일 수 있습니다. 처리가 실패한 이유는 무엇입니까?일시적인 오류였습니까?처리 로직을 재시도하는 것이 가능한 시나리오입니까?등등...
언급URL : https://stackoverflow.com/questions/41006498/forcing-eventprocessorhost-to-re-deliver-failed-azure-event-hub-eventdatas-to-i
'programing' 카테고리의 다른 글
CSS 콘텐츠를 사용하여 HTML 엔터티 추가 (0) | 2023.04.27 |
---|---|
셸에서 10개 이상의 매개 변수를 처리하는 방법 (0) | 2023.04.27 |
Tomcat 및 Eclipse를 핫 배포 환경으로 통합 (0) | 2023.04.27 |
ASP 유지NET 세션 오픈/얼라이브 (0) | 2023.04.22 |
로컬 Git 브랜치의 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.04.22 |