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

Azure 关于事件中心处理器中的检查点策略,azure,azure-eventhub,event-processor-host,Azure,Azure Eventhub,Event Processor Host,我使用事件中心处理器主机来接收和处理来自事件中心的事件。为了获得更好的性能,我每3分钟调用一次checkpoint,而不是每次接收事件时调用一次: public async Task ProcessEventAsync(context, messages) { foreach (var eventData in messages) { // do something } if (checkpointStopWatth.Elapsed > TimeSpan.FromMinu

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

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;
        }
    }
}

伟大的案件-你是掩护

在以下两种情况下,您可能会丢失
事件检查点
(因此
事件重播
):

  • 当您有稀疏的数据流(例如:每5分钟一批消息,检查点间隔为3分钟)并且
    EventProcessorHost
    实例因某种原因关闭时,您可以看到
    EventData
    -
    2分钟
    重新处理。为了处理这个案子,, 在完成
    IEventProcessor.onEvents
    /
    IEventProcessor.ProcessEventsAsync
    后,当您收到关闭的通知时,跟踪
    上次处理的事件
    检查点-
    IEventProcessor.onClose
    /
    IEventProcessor.CloseAsync

  • 可能只有这样一种情况-特定的
    EventHubs分区没有更多的事件
    。在这种情况下,使用
    检查点策略,您将永远不会看到最后一个事件被检查点。但是,当您有连续的
    EventData流时,这是不常见的,并且您没有发送到特定的eventhubblient分区
    EventHubClient.send(EventData\u没有分区键)
    )。如果您认为-您可能会遇到这种情况,请使用:

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


  • 每隔一段时间唤醒
    进程事件同步的标志。然后,跟踪,
    LastProcessedEventData
    LastCheckpointedEventData
    ,并在未收到
    事件时判断是否检查点,基于这些事件的
    EventData.SequenceNumber
    属性。

    为什么不使用每3秒滴答一次的计时器,这样您就不必依赖ProcessEventAsync?检查点必须在处理完所有事件后完成(//在示例代码中执行某些操作)。所以计时器似乎不起作用。谢谢Sreeram!您知道EventProcessor的默认接收超时值是多少吗?默认值是60秒。谢谢Streeram,我根据您在原始答案中的建议更新了代码。请看一看并发表评论好吗?@SreeramGarlapati根据EventProcessorOptions类setInitialPositionProvider方法的java文档,该方法确定在没有检查点的情况下开始接收事件的位置。这是否意味着,如果存在检查点,则在配置EventProcessorHost时,此方法将不包含任何内容?