发送到 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
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.CreateBatch
API得到一个Empty EventDataBatch
然后用TryAdd(EventData)
api添加事件来构建Batch。
并且,最后使用 EventDataBatch.ToEnumerable()
获取基础事件以传递给 EventHubClient.Send()
API.
我正在处理 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
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
.
在这种背景下,进入您的场景:实现非常 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.CreateBatch
API得到一个Empty EventDataBatch
然后用TryAdd(EventData)
api添加事件来构建Batch。
并且,最后使用 EventDataBatch.ToEnumerable()
获取基础事件以传递给 EventHubClient.Send()
API.