微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Peek如何在启用了分区的服务总线队列中工作?

如何解决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 举报,一经查实,本站将立刻删除。