编程语言
首页 > 编程语言> > c# – 从Azure Event Hub获取事件后,我应该将我的事件放入队列吗?

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

作者:互联网

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

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

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

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

特别是:

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

Keep in mind you want to keep whatever it is you’re doing relatively
fast – i.e. don’t try to do many processes from here – that’s what
consumer groups are for.

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

The author of this article added a queue between the Event Hub and the
worker role (it’s not clear from the comments if it’s really required
or not).

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

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

解决方法:

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

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

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

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

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

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

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

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

标签:c,azure,azure-queues,azure-eventhub,lambda-architecture
来源: https://codeday.me/bug/20190519/1137694.html