我正在处理EventHub的高吞吐量应用程序。根据{{3}},为了从单个发送方获得非常高的吞吐量,则需要客户端批处理(每个事件不超过256 KB限制)。
documentation建议客户端批处理以实现性能改进。它描述了客户端批处理可用于队列或主题客户端,这可以延迟发送消息一段时间,然后它一次性传输消息。
在EventHub客户端中是否可以使用客户端批处理?
答案 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。
答案 1 :(得分:1)
您的链接准确无误。事件中心有SendBatch和SendBatchAsync方法。 https://msdn.microsoft.com/library/azure/microsoft.servicebus.messaging.eventhubclient.sendbatch.aspx?f=255&MSPPError=-2147217396