从Azure Event Hub获取后,我应该将我的事件放入队列吗?

ken*_*n2k 7 c# azure azure-queues azure-eventhub lambda-architecture

我目前正在开发一个使用Azure Event Hub托管在Azure上的应用程序.基本上我是从Web API向Event Hub发送消息(或者我应该说,事件),我有两个监听器:

  • 用于实时分析的Stream Analytics任务
  • 标准辅助角色,根据收到的事件计算某些内容,然后将它们存储到Azure SQL数据库中(这是一个lambda体系结构).

我目前正在使用EventProcessorHost库从我的worker角色中的Event Hub中检索我的事件.

我正在尝试找到一些关于如何使用事件中心的最佳实践(使用事件中心比服务总线队列更难,即流式传输与消息消耗),我发现有些人说我不应该这样做EventData从事件中心检索事件后进行大量处理.

特别是:

请记住,您希望保留相对较快的任何内容 - 即不要尝试从此处执行许多过程 - 这就是消费者群体的用途.

本文的作者在Event Hub和worker角色之间添加了一个队列(如果确实需要,则从评论中不清楚).

所以问题是:我应该在Event Hub之后直接执行所有处理工作(即在ProcessEventsAsnyc我的IEventProcessor实现方法中),还是应该在Event Hub和处理器之间使用队列

任何有关如何正确使用事件中心事件的建议都会受到赞赏,文档目前有点......缺失.

cac*_*sar 6

这属于问题类别,一旦EventProcessorHost的源可用,其答案将更加明显,我已经被告知将会发生这种情况.

简短的回答是你不需要使用队列; 但是,我会保留ProcessEventsAsync返回任务相对较短的时间.

虽然这个建议听起来很像第一篇文章,但关键的区别在于它是返回任务而不是完成任务的时间.我的假设是在用于EventProcessorHost的线程上调用ProcessEventsAsync用于其他目的.在这种情况下,您需要快速返回,以便其他工作可以继续; 这项工作可能是为另一个分区调用ProcessEventsAsync(但我们不知道没有调试我没有发现它必须做或在可用时读取代码).

我通过从ProcessEventsAsync传递整个IEnumerable,在每个分区的单独线程上进行处理.这与将所有项目从IEnumerable中取出并将它们放入队列以供处理线程使用相反.另一个线程在处理完消息后完成ProcessEventsAsync返回的Task.(实际上,我给我的处理线程一个IEnumerable,它通过将块链接在一起并在调用MoveNext时需要完成任务来隐藏ProcessEventsAsync的细节).

所以简而言之:在ProcessEventsAsync中,将工作交给另一个线程,你已经知道如何与TPL进行通信或启动新任务.

将所有消息放入ProcessEventsAsync内的Queue中并不错,这不是将大块事件传递给另一个线程的最有效方法.

如果您决定将事件放入队列(或者在处理代码中有下游队列)并完成批处理的任务,则应确保限制代码/队列中未完成的项目数以避免运行如果EventHub为您提供的项目速度超过您的代码可以处理因流量高峰而处理它们的情况,则内存不足.

Java EventHub用户注意事项 2016-10-27:由于这引起了我的注意,这个描述描述了如何调用onEvents,而onEvents缓慢不会是悲剧,因为它在每个分区的一个线程上,它的速度似乎影响速度收到下一批的.因此,根据您对延迟的关注程度相当快,这对您的方案来说可能相对重要.