我们正在努力从 Microsoft.Azure.ServiceBus 迁移到 Azure.Messaging.ServiceBus。我们有一个非常复杂的实现,其中发送的消息可能超过 ServiceBusMessage(以前是 Microsoft.Azure.ServiceBus.Message)允许的最大大小。
我们有一个方法,从消息的大小开始,如果消息超过最大大小,则将其拆分为多条消息并分别发送。该方法使用 Message 中存在但不再存在于 ServiceBusMessage 中的属性。因此,如果我们尝试发送大于最大值的消息我们将收到一个异常,正如文档所述我们想要阻止它并分割消息,就像我们之前处理消息一样,但我找不到任何方法来知道它的大小。
stackoverflow 中有一个未回答的问题与我的非常相似: 如何获取ServiceBusMessage消息大小?
Azure.Messaging.ServiceBus
的推荐方法是使用ServiceBusMessageBatch来测量。 如果调用
TryAdd
返回
false
,则消息太大而无法包含。这里需要注意的是,对于大消息大小功能,服务总线引入了新的语义,其中单个消息的大小可能超过批量的大小,这在以前是不可能的。 如果您依赖大消息支持(> 1mb),则无法准确测量,因为消息序列化是在发送消息时发生的。
您最好的方法是使用主体的大小作为一般启发式,保留约 30k 的开销,并为您添加的任何应用程序属性保留保守的估计。