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

时间:2016-04-19 14:02:26

标签: azureservicebus azure-eventhub

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

documentation建议客户端批处理以实现性能改进。它描述了客户端批处理可用于队列或主题客户端,这可以延迟发送消息一段时间,然后它一次性传输消息。

在EventHub客户端中是否可以使用客户端批处理?

2 个答案:

答案 0 :(得分:6)

ShortAns :EventHubs旨在支持极高的吞吐量方案 - 客户端批处理是实现这一目标的关键功能之一。 API为`EventHubClient.SendBatch(IEnumerable)

长篇故事

您找到的链接:Best Practices for performance improvements using Service Bus brokered messaging适用于ServiceBus Queues&主题 - 使用名为 - SBMP的Microsoft专有协议 - 并非开放标准。我们在该协议中实现了BatchFlushInterval。这是一段时间(猜测在2010年左右) - Amqp协议尚未标准化。当我们开始构建Azure EventHubs服务时,Amqp是用于实现高性能消息传递解决方案的新标准协议,因此,我们使用Amqp作为事件中心的一流协议。 BatchFlushInterval在EventHubs(Amqp)中没有任何效果。

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

为了做到这一点,根据协议,它为每个Message添加了额外的字节。可以使用属性 - EventData SerializedSizeInBytes找到每个序列化EventData(到AmqpMessage)的估计大小。

有了这样的背景,进入你的场景:最佳方式,实现非常高的吞吐量 - 是使用EventHubClient.SendBatch(IEnumerable<EventData>) api。此Api的合同是 - 在调用SendBatch之前 - 调用者需要确保此批消息的序列化大小不超过256k。在内部,此API将IEnumerable<EventData>转换为1个单AmqpMessage并发送到EventHub服务。截至2016年4月25日,EventHubs服务强加的1个AmqpMessage限制为256k。另外,还有一个细节 - 当EventData列表被转换为单个AmqpMessage时 - EventHubClient需要将一些信息提升到BatchMessage标题中 - 这对于批处理中的所有消息都是通用的(info比如partitionKey)。这个信息。保证最高为6k。

总而言之,来电者需要跟踪EventData中所有IEnumerable<EventData>的总大小,并确保其低于250k

编辑于09/14/2017

我们添加了EventHubClient.CreateBatch API来支持此方案。

在构建一批EventData时,没有更多的猜测工作。从Empty EventDataBatch API获取EventHubClient.CreateBatch,然后使用TryAdd(EventData) api添加事件以构建批处理。

最后,使用EventDataBatch.ToEnumerable()将基础事件传递给EventHubClient.Send() API。

more on Event Hubs...

答案 1 :(得分:1)