发送到 Microsoft Azure EventHubs 时如何使用客户端事件批处理功能

How to use client-side event batching functionality while Sending to Microsoft Azure EventHubs

我正在处理 EventHub 的高吞吐量应用程序。根据 documentation,为了从单个发件人获得非常高的吞吐量,则需要客户端批处理(不超过每个事件 256 KB 的限制)。

Best Practices for performance improvements using Service Bus brokered messaging 建议客户端批处理以实现性能改进。它描述了客户端批处理可用于队列或主题客户端,它可以将消息的发送延迟一段时间,然后在单个批次中传输消息。

EventHub 客户端是否提供客户端批处理?

您的链接是准确的。事件中心有 SendBatch 和 SendBatchAsync 方法。 https://msdn.microsoft.com/library/azure/microsoft.servicebus.messaging.eventhubclient.sendbatch.aspx?f=255&MSPPError=-2147217396

还有a nice article and extension by Paolo Salvatori

ShortAns:EventHubs 旨在支持 very-high 吞吐量场景 - Client-side 批处理是实现此功能的关键功能之一。 API 是 `EventHubClient.SendBatch(IEnumerable).

说来话长

您找到的link:Best Practices for performance improvements using Service Bus brokered messaging applies to ServiceBus Queues & Topics - which uses a Microsoft Proprietary protocol called - SBMP - and is not an Open Standard. We implemented BatchFlushInterval in that Protocol. This was a while back (guess around 2010) - where Amqp protocol wasn't standardized yet. When we started building Azure EventHubs service - Amqp is the new Standard protocol for implementing performant messaging solutions and hence, we used Amqp as our first-class protocol for Event Hubs. BatchFlushInterval doesn't have any effect in EventHubs (Amqp).

EventHubClient 将您需要发送到 EventHub 的每个原始事件转换为 AmqpMessage(请参阅 (Amqp Protocol Specification) 中的消息部分)。

为了做到这一点,根据协议,它向每个消息添加了几个额外的字节。可以使用 属性 - EventData SerializedSizeInBytes.

找到每个序列化事件数据(到 AmqpMessage)的估计大小

在这种背景下,进入您的场景:实现非常 high-thruputs 的最佳方法是使用 EventHubClient.SendBatch(IEnumerable<EventData>) api。这个 Api 的约定是 - 在调用 SendBatch 之前 - 调用者需要确保这批消息的序列化大小不超过 256k。在内部,此 API 将 IEnumerable<EventData> 转换为 1 个单个 AmqpMessage 并发送到 EventHub 服务。 EventHubs 服务 as-of 4-25-2016 对 1 个单个 AmqpMessage 施加的限制是 256k。另外,还有一个细节 - 当 EventData 的列表被转换为单个 AmqpMessage - EventHubClient 需要将一些信息提升到 BatchMessage header - 这对于批次(信息如 partitionKey)。这个信息。保证最大为 6k。

因此,all-in-all、调用者需要跟踪 IEnumerable<EventData> 中所有 EventData 的总大小,并确保低于 250k .


编辑于 2017 年 9 月 14 日

我们添加了 EventHubClient.CreateBatch API 来支持这种情况。

构建一批 EventData 时不再需要猜测工作。从EventHubClient.CreateBatchAPI得到一个Empty EventDataBatch然后用TryAdd(EventData)api添加事件来构建Batch。

并且,最后使用 EventDataBatch.ToEnumerable() 获取基础事件以传递给 EventHubClient.Send() API.

more on Event Hubs...