【问题标题】:Batching to Event Hubs from an ASP .NET Application从 ASP .NET 应用程序批处理到事件中心
【发布时间】:2019-03-22 16:04:16
【问题描述】:

我有一组网站(异步)将事件分析发送到 ASP.NET 网站,然后应该将事件发送到 Azure EventHubs 实例。

我面临的挑战是,当请求超过每秒 50,000 个时,我注意到我为这些请求提供服务的响应时间在数秒范围内,这会影响初始发送网站的总加载时间。我已经扩展了所有部分,但是我认识到,由于打开与事件中心的 AMQP 连接并发送有效负载的开销,每个请求发送一个事件效率不高。

作为一种解决方案,我一直在尝试对发送到我的 EventHubs 实例的事件数据进行批处理,但是我在同步方面遇到了一些问题。 对于每个请求,我将事件数据添加到通过 EventHubClient.CreateBatch() 创建的静态 EventDataBatcheventHubData.TryAdd() 然后我检查事件的数量是否在预定义的阈值内,如果是,我通过 @ 异步发送事件987654324@。这带来的挑战是,由于这是一个 ASP .NET 应用程序,因此可能有许多线程试图在任何给定实例上服务请求 - 其中任何一个都可能试图在同一点上 eventHubData.TryAdd()EventHubClient.SendAsync()时间。作为解决此问题的糟糕尝试,我尝试在eventHubData.TryAdd() 之前调用lock(batch),但这并不能解决问题,因为我也无法锁定异步方法EventHubClient.SendAsync()

实现此解决方案的最佳方法是什么,以便每个请求不需要它自己对事件中心的请求,并且可以利用批处理,同时还保持批处理本身的完整性并且不会遇到任何死锁问题?

【问题讨论】:

    标签: c# asp.net azure concurrency azure-eventhub


    【解决方案1】:

    查看应用程序洞察 SDK 的源代码,了解他们如何解决此问题 - 您可以重用其中的关键部分,通过事件中心 AMQP 实现相同的目标。

    模式是,

    1) 缓冲数据。定义一个缓冲区,您将在最大大小的线程之间共享该缓冲区。多个线程将数据写入缓冲区

    https://github.com/Microsoft/ApplicationInsights-dotnet/blob/develop/src/Microsoft.ApplicationInsights/Channel/TelemetryBuffer.cs

    2) 准备传输。您可以在缓冲区已满、某个时间间隔过去或先发生的情况下传输缓冲区中的项目。从缓冲区中取出所有项目发送

    https://github.com/Microsoft/ApplicationInsights-dotnet/blob/develop/src/Microsoft.ApplicationInsights/Channel/InMemoryTransmitter.cs

    3) 进行传输。在单个事件中心消息中将所有项目作为多个数据点发送,

    https://github.com/Microsoft/ApplicationInsights-dotnet/blob/develop/src/Microsoft.ApplicationInsights/Channel/Transmission.cs

    它们是 3 个类,它们组合起来使用 HTTP 发布到 Application Insights 集合终结点 - 您可以看到如何应用示例模式来收集、合并和传输到事件中心。

    您需要控制最大消息大小,即每条事件中心消息 256KB,您可以通过设置遥测缓冲区大小来做到这一点 - 这取决于您的客户端逻辑来管理它。

    【讨论】:

    • 这是一个很好的起点,但远比我的需要复杂。是否有任何其他经过验证的解决方案可以作为我实施的基础?
    • 我会说在 50,000 RPS 时,您处于需要考虑这些方面的解决方案的范围内。缓冲区允许您同步“收集点”,并且发送器确保在任何时候只有一件事正在发送,这是您面临的两个问题。如果您想尝试其他方法,即锁定异步 SendAsync,请查看 SemaphoreSlim blog.cdemi.io/async-waiting-inside-c-sharp-locks。但是,答案中的模式实际上与您当前正在做的事情相差不远,并且不会付出太多努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2014-05-14
    • 2011-08-12
    相关资源
    最近更新 更多