【问题标题】:How to use client-side event batching functionality while Sending to Microsoft Azure EventHubs如何在发送到 Microsoft Azure EventHubs 时使用客户端事件批处理功能
【发布时间】:2016-08-11 18:26:28
【问题描述】:

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

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

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

【问题讨论】:

  • 我试过指定 MessagingFactorySettings,AmqpTransportSettings.BatchFlushInterval 没有任何效果。
  • 使用 SendBatch 和 SendBatchAsync 方法有什么问题吗?
  • 请贴出使用的代码和问题的详细描述,包括任何异常的全文(即使用Exception.ToString())。 “没有任何影响”是什么意思?有错误吗?没有消息发送吗?或者消息是作为单个消息而不是批量发送的?你是怎么检查的?
  • 另请注意,batch 不能超过 256KB。您是否尝试发送更大的批次?

标签: azureservicebus azure-eventhub


【解决方案1】:

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

长篇大论

您找到的链接:Best Practices for performance improvements using Service Bus brokered messaging 适用于 ServiceBus 队列和主题 - 它使用称为 SBMP 的 Microsoft 专有协议 - 并且不是开放标准。我们在该协议中实现了 BatchFlushInterval。这是很久以前的事了(大概是 2010 年左右)——Amqp 协议还没有标准化。当我们开始构建 Azure EventHubs 服务时 - Amqp 是用于实现高性能消息传递解决方案的新标准协议,因此,我们使用 Amqp 作为事件中心的一流协议。 BatchFlushInterval 在 EventHubs (Amqp) 中没有任何影响。

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

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

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

因此,总而言之,调用者需要跟踪 IEnumerable<EventData> 中所有 EventData 的总大小,并确保该大小低于 250k


编辑于 2017 年 9 月 14 日

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

构建EventDatas 的批次不再涉及猜测工作。从EventHubClient.CreateBatch API 获取Empty EventDataBatch,然后使用TryAdd(EventData) api 添加事件来构造Batch。

最后,使用EventDataBatch.ToEnumerable() 获取底层事件以传递给EventHubClient.Send() API。

more on Event Hubs...

【讨论】:

  • 感谢您为我等待的准确答案以及创建自定义实现的信息。
  • 为什么说“estimated Size of each Serialized EventData”?我们怎样才能得到确切的尺寸?如果我的批处理大小估计为 200KB 但实际上是 257KB,那么我就有问题了......
  • 如果我们不能得到确切的尺寸,一些关于SerializedSizeInBytes 近似值的保证会很好。例如,如果我知道每个事件的近似值最多减少 1KB,并且我有 10 个事件,我可以在达到 240KB 时停止。
  • 好东西,感谢更新!请注意,除非您提及我(@OhadSchneider),否则我不会收到通知,我只是碰巧回来查看并看到了这个。顺便说一句,您的@microsoft.com 别名是什么(我也是 MS 员工)?
  • @OhadSchneider - 每次创建 EventHubClient 对象时,客户端都会与服务协商消息大小。这需要传递给 EventDataBatch,因此需要传递给非静态工厂方法...
【解决方案2】:

【讨论】:

  • 我需要 EventHub 客户端功能类似于 ServiceBus Queues & Topics 客户端,延迟发送消息一段时间,然后他们将消息分批传输(不超过 256K)。根据Sreeram的说法,这个功能在EventHub客户端还没有实现,所以需要自定义实现。 Paolo Salvatori 的扩展可用于创建不超过 256K 限制的批次,但不幸的是,实现并不准确,可能会抛出 MessageSizeExceededException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多