【问题标题】:What is the order of messages delivered by QueueClient.Receive()QueueClient.Receive() 传递消息的顺序是什么
【发布时间】:2016-10-09 01:26:03
【问题描述】:

QueueClient.Receive() 以什么顺序传递消息? 我一直在运行一些测试,如果您不完成()它们,我可以看到一些消息(我猜是最上面的消息)会一遍又一遍地传递。 有没有办法强制它以循环方式交付?

【问题讨论】:

    标签: azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    当您有一条消息已传递但未完成时,一旦LockDuration 过期并被再次使用,消息就会出现在队列中。您必须完成消息。如果您不这样做,它最终会进入 DLQ,但在此之前,您的消费者会收到多次。

    QueueClient.Receive 获取代理(服务器)上可用的任何内容。我没有遵循循环传递的想法,因为它是一个队列。你会得到队列中的内容。根据经验,我建议不要依赖消息的顺序。

    也就是说,有一个 ASB 会话功能可以保存和保证交付的订单。如果您正在寻找会话,之前曾询问过similar question。

    【讨论】:

    • 关于保证有序投递,如果客户端没有对消息调用complete,又弹出来怎么办?我想在这种情况下没有保证
    • 如果消息没有完成,它将被重新发送。我会说这不是订购问题。
    【解决方案2】:

    创建QueueClient时可以指定接收模式并将其设置为ReceiveAndDelete:

    QueueClient.CreateFromConnectionString(connectionString, path, ReceiveMode.ReceiveAndDelete);
    

    这将使您能够在收到消息后立即将其从队列中删除,而不必调用Complete。

    如果您不拨打Complete或使用ReceiveAndDelete,则顺序为:

    • 获取消息(锁定 X 秒)
    • 按顺序获取下一条消息(锁定 X 秒)
    • 第一个消息锁已过期,因此您再次获取它并重新锁定它。
    • 第二条消息也是如此,以此类推。

    【讨论】:

    • 然后它会一遍又一遍地从顶部获取一些消息。但是有多少呢?
    • @GökhanKurt 不确定我是否理解您的问题。
    • 我从答案中了解到,它将锁定一些最重要的并锁定它们(在您的示例中为 2)。然后当锁过期时,它会再次尝试这两个。假设 2 个项目只是一个示例,它将锁定并尝试多少个?还是只会锁定最上面的一个并等到锁定到期?或者,它可能会尝试从顶部开始的每一项,直到锁定过期,然后重新开始。
    • 我现在明白了;它将按顺序锁定队列顶部底部中的所有消息。锁定到期后,您收到的下一条消息是最早锁定的消息。
    • 某处应该有一些默认的过期时间。您可以在哪里说明它将锁定每条消息的时间。
    猜你喜欢
    • 2011-03-14
    • 2014-08-11
    • 2014-02-17
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2021-06-19
    • 2018-11-18
    相关资源
    最近更新 更多