【问题标题】:Not all messages peeked from Azure Service Bus queue并非所有消息都从 Azure 服务总线队列中窥视
【发布时间】:2020-12-23 17:23:13
【问题描述】:

我有一个 Azure 服务总线队列,死信子队列中有 236 条消息。我知道这一点是因为 Azure 门户和服务总线资源管理器向我显示了这个数字。

我在 LINQPad 中编写了以下代码来检索所有 236 条消息并检查它们。然而,它只返回 236 条消息中的 136 条。

我正在使用 Microsoft.Azure.ServiceBus nuget 包的 v5.1.0。

对于为什么我没有收到所有 236 条消息有什么想法吗?

const string queueName = "the-queue-name";
const string serviceBusConnectionString = "Endpoint=...";

var receiver = new MessageReceiver(serviceBusConnectionString, EntityNameHelper.FormatDeadLetterPath(queueName));
var receivedMessages = await receiver.PeekAsync(300);

Console.WriteLine($"Received [{receivedMessages.Count()}] dead-letters");

【问题讨论】:

    标签: .net azure azure-servicebus-queues


    【解决方案1】:

    Peek 操作未检索到您指定的确切计数可能有两个原因:

    一个原因是消息集合的聚合大小超过了 256 KB 的最大大小。另一个原因是,如果队列或主题的 EnablePartitioning 属性设置为 true,则分区可能没有足够的消息来完成请求的消息数。

    所以通常我建议你重复使用Peek 操作,可能使用循环。假设您在执行PeekAsync(236) 时收到了 236 条消息中的 136 条。在这种情况下,您必须记下实际收到的计数并调用PeekAsync(236 - returned count),它的参数带有减去的值。 returned count 应该在每次得到结果时递增。

    您正在使用的客户端对象会记住上次查看的序列号,然后继续检索下一组消息。这样您就可以检索所有消息。

    【讨论】:

      【解决方案2】:

      无法保证偷看消息能够准确检索到您请求的消息数量。这是您将收到的最大消息数。在最新的 SDK(版本 7)中,传递给 PeekMessagesAsync 方法的参数称为 maxMessages,并记录为:

      将获取的最大消息数。

      一个常见的解决方案确实是循环直到您获得所需数量的消息或在代码允许的情况下对不同大小的批次进行操作。

      【讨论】:

        猜你喜欢
        • 2017-04-22
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多