【问题标题】:any way to retrieve skipped event using EventProcessorHost in azure event hub?有什么方法可以在 Azure 事件中心使用 EventProcessorHost 检索跳过的事件?
【发布时间】:2016-01-30 09:22:25
【问题描述】:

我正在使用 azure 事件中心的 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”中,但在工作角色回收并重新注册“EventProcessorHost”之前它们永远不会再次出现。

我在这个问题上停留了几天,请有人弄清楚我错过了什么。

提前非常感谢!

【问题讨论】:

    标签: .net azure azureservicebus azure-eventhub


    【解决方案1】:

    不,事件是按顺序接收的,无论您选择如何处理它们。因此,即使 foreach 循环一旦你跳出它就永远不会被执行,只要你有租约活动和要接收的事件,ProcessEventsAsync 就会被调用。

    【讨论】:

      【解决方案2】:

      您缺少的是这里有两层,一层从 eventthub 获取数据,第二层处理数据。

      EventProcessorHost 对开发人员隐藏了这一点,其中包括多个事件处理器运行时的自动分区平衡。

      所以实际发生的是,从 eventthub 获取数据的层保持内部状态,其中包括获取的最后一个事件,因此,如果同一个事件处理器正在处理数据,是否进行结帐并不重要从同一个分区(没有失去它的分区“所有权”),它会一直不断地获取新数据。

      结帐实际上是针对事件处理器“A”失去他在分区“X”上的租约(“所有权”)并且事件处理器“B”(包括它内部的事件获取模块)正在获取分区上的“所有权”的情况“X”,在这种情况下,事件处理器“B”需要知道事件处理器“A”使用“checkout”方法做出“直到这里我安全地处理了事件”语句的最后时间点。

      话虽如此,您应该知道事件处理器接收到的每个事件都应该以某种方式处理,如果您不想在线程数超过 50 时处理事件,您至少应该将这些事件移到另一个放置(可以是另一个 eventthub/queue 或任何其他服务/存储)以供进一步处理。

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        相关资源
        最近更新 更多