假设我有一个集合 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/