我从 Microsoft docs 了解到在第一个 Peek() 操作期间,任何一个可用的消息代理都会响应并发送其最旧的消息。然后在后续的 Peek() 操作中,我们可以遍历分区来查看序列号增加的每条消息。
我的问题是,在第一次 Peek() 操作期间,我将从任何第一个响应的分区中收到一条消息。是否能保证我可以查看队列中的所有消息?
以更简单的方式,共有三个分区: 分区“A”有 10 条消息,序列号从 1 到 10。 分区“B”有 10 条消息,序列号从 11 到 20。 分区“C”有 10 条消息,序列号从 21 到 30。
现在,如果我执行 Peek() 操作,如果分区“B”首先响应,我将收到的第一条消息是序列号为 11 的消息。下一个 peek 操作将查找序列号递增的消息。我会不会错过来自分区“A”的消息,该分区的序列号为 1-10,而窥视操作永远无法到达,因为它总是搜索递增的序列号?
更新
QueueClient queueClient = messagingFactory.CreateQueueClient("QueueName", ReceiveMode.PeekLock);
BrokeredMessage message = null;
while (iteration < messageCount)
{
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);
iteration++;
}
是否可以保证我可以使用上面的代码片段浏览分区队列的所有消息?
最佳答案
There is no guarantee that the returned message is the oldest one across all partitions.
因此,这取决于哪个消息代理首先响应,并且将显示来自该分区的最旧的消息。在您的示例中,没有关于哪个分区首先响应的一般规则,但可以保证首先显示该分区中最旧的消息。
如果要按序列号检索消息,请使用重载的 Peek 方法 Peek(Sequencenumber)
,请参阅:https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-browsing
关于c# - Peek 如何在启用分区的服务总线队列中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64511396/