【发布时间】:2019-03-22 16:04:16
【问题描述】:
我有一组网站(异步)将事件分析发送到 ASP.NET 网站,然后应该将事件发送到 Azure EventHubs 实例。
我面临的挑战是,当请求超过每秒 50,000 个时,我注意到我为这些请求提供服务的响应时间在数秒范围内,这会影响初始发送网站的总加载时间。我已经扩展了所有部分,但是我认识到,由于打开与事件中心的 AMQP 连接并发送有效负载的开销,每个请求发送一个事件效率不高。
作为一种解决方案,我一直在尝试对发送到我的 EventHubs 实例的事件数据进行批处理,但是我在同步方面遇到了一些问题。
对于每个请求,我将事件数据添加到通过 EventHubClient.CreateBatch() 创建的静态 EventDataBatch 和 eventHubData.TryAdd() 然后我检查事件的数量是否在预定义的阈值内,如果是,我通过 @ 异步发送事件987654324@。这带来的挑战是,由于这是一个 ASP .NET 应用程序,因此可能有许多线程试图在任何给定实例上服务请求 - 其中任何一个都可能试图在同一点上 eventHubData.TryAdd() 或 EventHubClient.SendAsync()时间。作为解决此问题的糟糕尝试,我尝试在eventHubData.TryAdd() 之前调用lock(batch),但这并不能解决问题,因为我也无法锁定异步方法EventHubClient.SendAsync()。
实现此解决方案的最佳方法是什么,以便每个请求不需要它自己对事件中心的请求,并且可以利用批处理,同时还保持批处理本身的完整性并且不会遇到任何死锁问题?
【问题讨论】:
标签: c# asp.net azure concurrency azure-eventhub