c# - 拆分一批要发送到 Azure 服务总线的消息

标签 c# azure azureservicebus

假设我有一个集合 List<BrokeredMessage>我想要批量发送到 Azure 服务总线的消息。

集合大小是任意的,因此所有消息组合的总大小可能会超过服务总线规定的 256k 限制。如何以最佳方式将其分割成更小的 block ?

这个任务看似简单,实则不然:每个 BrokeredMessage 的大小在我尝试发送之前未知。 Size属性仅返回消息正文的大小,没有 header 和其他开销。

如果我尝试发送 1000 条消息,每条消息正文为 250 字节,我将得到 MessageSizeExceededException 。问题是现在我什至无法重试,因为消息已经被消耗,所以我必须重新创建所有 BrokeredMessage的。

因此,我目前看到的唯一方法是在发送大量小消息时对批量大小非常保守,这可能会花费我一些吞吐量。

有更可靠和/或更干净的方法吗?

最佳答案

So the only way I see for now is to be very conservative about the batch size when lots of small messages are sent, which will probably cost me some throughput.

这不仅会影响吞吐量,还会影响可靠性。当 MessageSender.SendBatchAsync()使用时,所有消息都作为原子操作发送,并且要么成功,要么失败。

Are there more reliable and/or clean ways

使用 TransactionScope 包装所有发送将达到相同的效果,但您将不再批量发送消息。

如果您仍然想批量发送并且,请确保您不会遇到大小/计数问题,就像建议的那样,您可以对发送进行分块。不幸的是,Size 属性无法用于大小估计。它在序列化之前报告正文。除非使用Stream,否则不会应用序列化。即使如此,您的尺寸仍然会受到标准和自定义属性的影响。当重新安排 WindowsAzure.ServiceBus 的文档时,BrokeredMessage 的 MSDN API 文档中丢失了以下注释。 :

To get an accurate value for the size of a BrokeredMessage, you should read the Size property after completing the Send/Receive operation on the BrokeredMessage.

我采用了一种基于估计大小的分块方法。估计大小基于一定的填充百分比来增加消息的大小,预计平均消息将小于填充的大小。基于字符串的属性的加号和平均假定大小。在此blog post我已经阐述了估计单个消息大小的想法,该大小用于计算可以批量发送的 block 大小。

关于c# - 拆分一批要发送到 Azure 服务总线的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44779707/

相关文章:

c# - 两点之间的弧段和半径

azure - 在 PowerShell 中将字符串表达式转换为日期类型

azure - 是否有任何规定可以在 Azure 门户本身中更改 Azure AD 用户的密码过期时间

azure - 我可以使用 Terraform 将 azure 函数添加到 DPS 吗?

node.js - 使用 node.js 在特定延迟后从 Azure ServiceBus 主题发送消息

c# - 处理 WPF TextBox LostFocus 事件和绑定(bind)的顺序

c# - 在 C# 中释放后期绑定(bind)对象

c# - .NET 类属性 - 带参数的 setter ?

azure - Microsoft Azure ServiceBus - 如何进行请求/响应?

azureservicebus - Azure 服务总线超时