如何解决Peek如何在启用了分区的服务总线队列中工作?
我从Microsoft docs处了解到,在执行第一个Peek()操作期间,任何可用的消息代理都会响应并发送其最早的消息。然后,在随后的Peek()操作中,我们可以遍历分区以窥视序列号增加的每条消息。
我的问题是,在第一个Peek()操作期间,我将从任何第一个响应的分区中收到一条消息。是否可以保证可以查看队列中的所有消息?
以更简单的方式,可以分为三个分区: 分区“ A”有10条消息,其序列号为1到10。 分区“ B”有10条消息,其序列号为11到20。 分区“ C”有10条消息,其序列号从21到30。
现在,如果我执行Peek()操作,如果分区“ B”首先响应,则我收到的第一条消息是序列号为11的消息。下一个peek操作将查找序列号为递增的消息。我是否会错过序列号为1-10的分区“ A”的消息,因为它总是搜索递增的序列号,所以窥视操作永远无法达到?
更新
QueueClient queueClient = messagingFactory.CreateQueueClient("QueueName",ReceiveMode.PeekLock);
brokeredMessage message = null;
while (iteration < deadLetterMessageCount)
{
message = queueClient.Peek(); // According to docs,Peeks the oldest message from any responding broker,and next iterations peek the message with incremented sequence number
if (message == null)
break;
Console.WriteLine(message.SequenceNumber);
}
是否可以确保使用上面的代码段浏览分区队列中的所有消息?
解决方法
不能保证返回的消息是所有分区中最早的消息。
因此,这取决于哪个消息代理首先响应,并且将显示该分区中最早的消息。在您的示例中,哪个分区将首先响应没有一般性规则,但是可以保证首先显示该分区中最早的消息。
如果要按序列号检索消息,请使用重载的Peek方法 Peek(Sequencenumber)
,请参阅:https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-browsing
对于分区的实体,序列号是相对于分区发布的。
[...]
SequenceNumber值是一个唯一的64位整数,分配给消息时,消息被代理接受并存储,并用作其内部标识符。对于已分区实体,最高的16位反映分区标识符。 (https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing)
因此,您无法比较各个分区之间的序列号以查看哪个版本更旧。
作为一个例子,我刚刚创建了一个分区队列,并将几个消息放入两个分区(按顺序):
1. Partition 1,SequenceNumber 61924494876344321
2. Partition 2,SequenceNumber 28991922601197569
3. Partition 1,SequenceNumber 61924494876344322
4. Partition 1,SequenceNumber 61924494876344323
5. Partition 2,SequenceNumber 28991922601197570
浏览/浏览消息:仅在较旧的WindowsAzure.ServiceBus库中可用。 PeekBatch并不总是返回MessageCount属性中指定的消息数。此行为有两个常见原因。原因之一是消息集合的总大小超过了256 KB的最大大小。另一个原因是,如果队列或主题的EnablePartitioning属性设置为true,则分区可能没有足够的消息来完成请求的消息数。 通常,如果应用程序希望接收特定数量的消息,则应重复调用PeekBatch,直到获得该数量的消息,否则便不再有其他消息可以窥视。 (https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning,着重强调)
这样,您应该能够重复调用Peek / PeekBatch以最终获得所有消息。至少,如果您使用官方的SDK。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。