Azure 关于事件中心处理器中的检查点策略
我使用事件中心处理器主机来接收和处理来自事件中心的事件。为了获得更好的性能,我每3分钟调用一次checkpoint,而不是每次接收事件时调用一次: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
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;
}
}
}
伟大的案件-你是掩护 在以下两种情况下,您可能会丢失
事件检查点
(因此事件重播
):
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时,此方法将不包含任何内容?