我正在使用azure event hub的EventProcessorHost来处理一批事件。出于某种原因,我必须通过在线程计数达到最大值时不写入检查点来跳过事件,但是我必须在线程计数下降后检索那些跳过的事件。请参阅以下实施:
async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
//Process Events
foreach (var eventData in messages)
{
if (Process.GetCurrentProcess().Threads.Count <= 50)
{
//do work
await context.CheckpointAsync(eventData);
}
else
{
//do not write Checkpoint
break;
}
}
}
这是一个简单而直接的逻辑,但它不像我预期的那样工作。一旦“break”行达到“foreach”中断,我预计那些跳过的事件将显示在下一个“ProcessEventsAsync”中,但是它们永远不会再来,直到worker角色回收并重新注册“EventProcessorHost”。
我已经坚持这个问题几天,请有人弄清楚我错过了什么。
非常感谢提前!
答案 0 :(得分:0)
不,无论您选择如何处理事件,都会按顺序接收事件。因此,即使foreach
循环一旦突破就永远不会被执行,只要您有租约活动和要接收的事件,就会调用ProcessEventsAsync
。
答案 1 :(得分:0)
你缺少的是这里有两层,一层从eventhub获取数据,第二层用于处理数据。
EventProcessorHost从开发人员那里隐藏了这一点,其中包括多个事件处理器运行时的自动分区平衡。
实际上,实际发生的是从eventhub获取数据的层保持内部状态,其中包括最后一个被提取的事件,因此,如果您执行checkout则无关紧要,如果相同的事件处理器正在处理数据从同一个分区(没有丢失它的分区“所有权”),它将一直不断获取新数据。
结帐实际上是针对事件处理器“A”在分区“X”上丢失其租约(“所有权”)并且事件处理器“B”(包括其内部事件获取模块)在分区上占用“所有权”的情况“X”,在这种情况下,事件处理器“B”需要知道事件处理器“A”使用“checkout”方法做出“直到这里i'v处理事件安全”声明的最后时间点。 / p>
在说完之后,您应该知道事件处理器正在接收的每个事件都应该以某种方式处理,如果您不希望在线程数超过50时处理事件,那么至少应该将这些事件移动到另一个事件place(可以是另一个eventhub /队列或任何其他服务/存储)以供进一步处理。