Mik*_*kov 6 c# azure azureservicebus
假设我有一组List<BrokeredMessage>消息要批量发送到Azure Service Bus.
集合大小是任意的,因此所有消息的总大小可能超过Service Bus强加的256k的限制.如何以最佳方式将其拆分为较小的块?
这个任务似乎很简单,但似乎不是:BrokeredMessage在我尝试发送它之前,每个的大小都是未知的.Sizeproperty只返回消息体的大小,没有头和其他开销.
如果我尝试发送每条250字节的1000条消息,我会得到MessageSizeExceededException.问题是,现在我甚至无法重试,因为消息已被消耗,所以我必须重新创建所有BrokeredMessage的消息.
因此,我现在看到的唯一方法是在发送大量小消息时对批量大小非常保守,这可能会花费我一些吞吐量.
有更可靠和/或更干净的方式吗?
因此,我目前看到的唯一方法是在发送大量小消息时对批量大小非常保守,这可能会花费我一些吞吐量。
它不仅会降低吞吐量,还会降低可靠性。使用时MessageSender.SendBatchAsync(),所有消息都作为原子操作发送,并且要么成功,要么一起失败。
有没有更可靠和/或更干净的方法
使用TransactionScope包装所有发送将达到相同的效果,但您将不再批量发送消息。
如果您仍然想批量发送并确保不会遇到大小/计数问题,就像建议的那样,您可以对发送进行分块。不幸的是,该Size房产无法进行面积估算。它在序列化之前报告正文。除非使用Stream,否则不应用序列化。即使如此,您的尺寸仍然会受到标准和自定义属性的影响。当重新安排 WindowsAzure.ServiceBus 的文档时,以下注释从 MSDN API 文档中丢失BrokeredMessage:
要获得 BrokeredMessage 大小的准确值,您应该在完成 BrokeredMessage 上的发送/接收操作后读取 Size 属性。
我采取了一种基于估计大小的分块方法。估计大小基于一定的填充百分比来增加消息的大小,预计平均消息将小于填充的大小。基于字符串的属性的加号和平均假定大小。在这篇博文中,我阐述了估计单个消息大小的想法,该消息大小用于计算可以批量发送的块大小。