我有Azure Service Bus设置,上面有一堆队列。有些是分区的。当我尝试从其中一个队列中读取死信消息时,我推迟了消息,然后做了一些按摩,然后尝试完成那些延期消息。这就是麻烦的来源。在致电QueueClient.ReceiveBatch()
时,我收到InavlidOperationException
例外情况并发出以下消息:
不支持从不同分区接收序列号 对于启用了分区的实体。
内部异常包含以下理由:
来自不同分区的BR0012ReceiveBatch序列号不是 支持已启用分区的实体。
这是实际的代码行,它产生错误:
var deferredMessages = queueClient?.ReceiveBatch(lstSequenceNums);
其中lstSequenceNums是List<long>
的类型,包含延迟消息的序列号; queueClient的类型为QueueClient
所以我想知道如何处理这种情况?我不太明白为什么首先抛出这个异常?如果这个预期的行为我怎么能找出分区和Service Bus消息序列号之间的关系?
非常感谢任何帮助。
答案 0 :(得分:1)
从Azure Service Bus partitioning documentation,请求单个消息
当客户端想要从分区队列或订阅分区主题接收消息时,Service Bus会查询所有片段以获取消息,然后将从任何消息存储库获取的第一条消息返回给接收方。
和
每个分区队列或主题由多个片段组成。每个片段都存储在不同的消息传递存储中,并由不同的消息代理处理。
我怀疑您通过使用来自不同分区的序列号请求批处理来请求来自多个分区的消息,它将强制查询太多代理并且Azure Service Bus服务不允许
SequenceNumber
可以帮助确定您的邮件来自哪个分区。前16位用于encode the partition ID。你可以将你的批处理分成不同的电话。
ReceiveBatch(IEnumerable<int64>)
确实对此有所说明。我建议raise an issue与团队一起澄清文档。
答案 1 :(得分:0)
我通过逐个阅读消息(获取循环中的所有消息)并完全放弃批量阅读方法来实现它,因为它太脆弱且无法发布。如果在一个Azure Service Bus上有分区队列,它是目前唯一的选择。 Sean Feldman提供了一些见解(再次感谢你),但它并没有提供任何可接受的方法来为手头的任务制定ReceiveBatch
可行的解决方案。