关于事件中心处理器中的检查点策略

时间:2018-08-15 20:28:03

标签: azure azure-eventhub event-processor-host

我使用事件中心处理器主机来接收和处理来自事件中心的事件。为了获得更好的性能,我每3分钟调用一次检查点,而不是在收到事件时每次调用一次:

public async Task ProcessEventAsync(context, messages)
{
 foreach (var eventData in messages)
 {
    // do something
 }

 if (checkpointStopWatth.Elapsed > TimeSpan.FromMinutes(3);
 {
     await context.CheckpointAsync();
 }
}

但是问题是,如果不是新事件发送到事件中心,则可能会有一些事件永远不会成为检查点,因为如果没有新消息,则不会调用ProcessEventAsync。

有什么建议可以确保所有已处理的事件都是检查点,但仍然每隔几分钟检查一次?

更新:根据Sreeram的建议,我更新了以下代码:

public async Task ProcessEventAsync(context, messages)
{
    foreach (var eventData in messages)
    {
     // do something    
    }

    this.lastProcessedEventsCount += messages.Count();

    if (this.checkpointStopWatth.Elapsed > TimeSpan.FromMinutes(3);
    {
        this.checkpointStopWatch.Restart();
        if (this.lastProcessedEventsCount > 0)
        {
            await context.CheckpointAsync();
            this.lastProcessedEventsCount = 0;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

好消息-您在掩护!

在以下两种情况下,您可能会损失event checkpoints(因此event replay):

  1. 当数据流稀疏时(例如:每5分钟发送一批消息,检查点间隔为3分钟)并且EventProcessorHost实例由于某种原因关闭-您可能会看到{{1} 2 min中的}-重新处理。为了处理这种情况, 在完成EventData / lastProcessedEvent和检查点后,当您关闭时收到通知-IEventProcessor.onEvents / IEventProcessor.ProcessEventsAsync,请跟踪IEventProcessor.onClose

  2. 在某些情况下-不再有特定IEventProcessor.CloseAsync的事件。在这种情况下,您将永远不会看到最后一个事件被检查点-用EventHubs partition。但是,当您有Checkpointing strategy的连续流并且没有发送到特定的 EventHubs分区EventData)时,这种情况并不常见。如果您认为-您可能会遇到这种情况,请使用:

      

    EventProcessorOptions.setInvokeProcessorAfterReceiveTimeout(true); //在Java或      EventProcessorOptions.InvokeProcessorAfterReceiveTimeout = true; //在C#中

标志可经常唤醒EventHubClient.send(EventData_Without_PartitionKey)。然后,基于这些事件的processEventsAsync属性,跟踪LastProcessedEventDataLastCheckpointedEventData并判断是否在没有收到Events时检查点。