从 Azure 事件中心获取事件后,我是否应该将其放入队列中?

2024-05-19

我目前正在开发一个托管在 Azure 上、使用 Azure 事件中心的应用程序。基本上,我从 Web API 向事件中心发送消息(或者应该说事件),并且我有两个侦听器:

  • 用于实时分析的流分析任务
  • 标准辅助角色,根据接收到的事件计算一些内容,然后将它们存储到 Azure SQL 数据库中(这是 lambda 架构)。

我目前正在使用事件处理器主机 https://www.nuget.org/packages/Microsoft.Azure.ServiceBus.EventProcessorHost用于从我的辅助角色内的事件中心检索事件的库。

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

具体来说 :

  • http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx

请记住,您想要相对保留正在做的事情 快速 - 即不要尝试从这里执行许多流程 - 这就是 消费群体是为了。

  • http://blogs.msdn.com/b/musings_on_alm_and_software_development_processes/archive/2014/09/03/azure-event-hubs-queues-and-workers.aspx http://blogs.msdn.com/b/musings_on_alm_and_software_development_processes/archive/2014/09/03/azure-event-hubs-queues-and-workers.aspx

本文作者在事件中心和事件中心之间添加了一个队列 工人角色(从评论中不清楚是否确实需要 或不)。

所以问题是:我应该在事件中心之后直接进行所有处理工作吗(即在ProcessEventsAsnyc我的方法IEventProcessor https://msdn.microsoft.com/en-us/library/hh435336.aspx执行),或者我应该在事件中心和处理内容之间使用队列?

任何有关如何正确使用事件中心事件的建议将不胜感激,文档目前有点......缺失。


这属于这样一个问题的类别,一旦 EventProcessorHost 的源代码可用,其答案将更加明显,我被告知这将会发生。

简而言之,您不需要使用队列;只需使用队列即可。但是,我会保持 ProcessEventsAsync 返回任务所需的时间相对较短。

虽然这个建议听起来很像第一篇文章 http://blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx,关键区别在于它是返回任务的时间而不是任务完成的时间。我的假设是在用于 EventProcessorHost 的线程上调用 ProcessEventsAsync 以用于其他目的。在这种情况下,您需要尽快返回,以便继续其他工作;这项工作可能会为另一个分区调用 ProcessEventsAsync (但如果不进行调试,我们就不会知道,我还没有发现有必要在可用时执行或读取代码)。

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

简而言之:在 ProcessEventsAsync 中,将工作移交给另一个线程,无论是您已经拥有的知道如何与之通信的线程,还是使用 TPL 启动新任务的线程。

将所有消息放入 ProcessEventsAsync 内部的队列中不是bad这并不是将事件块传递到另一个线程的最有效方法。

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

Java EventHub 用户注意事项2016年10月27日: 自从这引起我的注意以来这个描述 https://github.com/Azure/azure-event-hubs/blob/06c0c637438af6e6aba366b211ff920a34d9db38/java/azure-eventhubs-eph/src/main/java/com/microsoft/azure/eventprocessorhost%5C/EventHubPartitionPump.java#L194描述如何调用 onEvents,同时onEvents https://github.com/Azure/azure-event-hubs/blob/master/java/azure-eventhubs-eph/src/main/java/com/microsoft/azure/eventprocessorhost/IEventProcessor.java#L56慢不会是悲剧,因为它在每个分区的一个线程上,它的速度appears影响接收下一批的速度。因此,取决于您对延迟的关心程度,这里的延迟对于您的场景来说可能相对重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Azure 事件中心获取事件后,我是否应该将其放入队列中? 的相关文章