programing

이벤트 프로세서 강제 실행실패한 Azure 이벤트 허브 이벤트 Data를 IEventProcessor에 다시 전달할 호스트입니다.프로세스 이벤트 메서드

starjava 2023. 4. 27. 21:43
반응형

이벤트 프로세서 강제 실행실패한 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/supportabilityEPH프레임워크, vs.Technical-Correctness.

이상적인 상황은 다음과 같습니다.사용자가 코드를 입력할 때IEventProcessorImpl.ProcessEventsAsync예외 발생 -EPH도서관은 이것을 잡아서는 안 됩니다.이걸 그냥 놔뒀어야 했어요Exception충돌시킵니다.crash-dump는 명하게보다니줍여확▁the▁shows를 명확히 보여줍니다.callstack책임지는.나는 여전히 믿는다 - 이것이 가장.technically-correct해결책

현재 상황:의 계약.IEventProcessorImpl.ProcessEventsAsyncAPI &EPH 즉,

  1. EventDataEventHubs 서비스에서 수신할 수 있습니다. 사용자 콜백을 계속 호출합니다.IEventProcessorImplementation.ProcessEventsAsync)와 함께 께함와께EventData's할 경우, : " " " " " "EventProcessorOptions.ExceptionReceived.
  2. 내사자코 내부의 IEventProcessorImpl.ProcessEventsAsync하고 모든오를통합야니다해합고처리를 통합해야 합니다.Retry's필요에 따라 EPH사용자에게 처리 시간을 완전히 제어할 수 있도록 이 콜백에 대한 시간 초과를 설정하지 않습니다.
  3. - 특정이원문인경 - 표시EventData속성 - ="type" (예: type=)poison-event 동일한 한주재전송로로 다시 .EventHub사건에 합니다.)EventData.Offset그리고.SequenceNumberEventData.ApplicationProperties) 또는 SERVICEBUS 큐에 저장하거나 다른 곳에 저장합니다. 기본적으로 포이즌 이벤트를 식별하고 처리를 연기합니다.
  4. 만약 , 은 바로 당신의 문제입니다.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

반응형