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

标签 c# azure azureservicebus azure-servicebus-queues

我从 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/

相关文章:

c# - Fluent Nhibernate 映射通过两个非主键列连接

c# - 为什么我的 WCF 客户端在调用引发事件的 WCF 服务器中的方法后超时?

asp.net-mvc - 从 HTTP 重定向到 HTTPS 时,Windows Azure ASP.NET MVC 角色行为异常

node.js - 在 Node.js Azure 函数中检索服务总线消息的属性

c# - ReceiveAsync 和 OnMessageAsync 之间的差异

C# OutOfMemory、映射内存文件或临时数据库

c# - 是否可以通过代码从 System.Web.UI.HtmlControls.HtmlButton 设置类属性?

c# - Azure 应用程序配置重新加载失败时如何记录错误

azure - 如果数据量非常低(总记录数 < 50k),如何在 Azure Cosmos 中选择分区键

azure - 如何在 Azure 上为匿名 HTTP API 消息创建代理?