【问题标题】:What is the order of the messages in a Azure Service Bus queue if I send them asynchronously?如果我异步发送消息,Azure 服务总线队列中消息的顺序是什么?
【发布时间】:2017-08-04 05:08:14
【问题描述】:

如果使用 SendAsync(...) 将消息发送到 Azure 服务总线主题/队列,消息顺序是否有保证?

例如,如果我有一个应用程序,它的一个线程使用 SendAsync 发送大量消息,是否会保持调用方法 SendAsync 的顺序?服务总线客户端库是否足够聪明,可以知道虽然消息将异步发送,但它们添加到主题的顺序始终保持不变?

【问题讨论】:

标签: azure asynchronous servicebus azureservicebus azure-servicebus-queues


【解决方案1】:

无论是否异步,试图从消息总线中提取排序保证有点滑坡。您受制于始终不可靠的网络。

请注意,Azure 服务总线默认不提供任何排序​​保证。您可以通过消息会话引入一些先进先出的顺序,但这不足以保证您的消息将被处理的顺序。这里有一篇很好的文章总结了消息排序的困难:

http://blog.jayway.com/2013/12/20/message-ordering-on-windows-azure-service-bus-queues/

一般来说,我尝试设计消息,以便排序无关紧要。如果失败了,我建议将序列号添加到消息消费者可以解释的消息中。

【讨论】:

  • 是的,你说得很好。这是一个复杂的领域,我已经阅读了很多关于确保消息按顺序处理的错综复杂的内容。但是现在,我只想至少看到我可以将它们以正确的顺序添加到队列中,我可以通过 1 个进程和同步的 Send() 调用来实现。我要确定的是 SendAsync() 是否可能...
  • 我有一个测试应用程序,我使用一个循环将许多消息发送到一个主题,该循环一次执行 5 个 sendAsyncs。我至少可以在启动时告诉你,第一条 sendAsync 消息从来都不是进入主题的第一条消息。
  • 在求助于序列号之前,是否可以在发送到一个主题之前等待 N 秒,从而保证每条消息有足够的领先优势在下一条之前到达那里?问题仍然存在:N 的故障安全值是多少。
【解决方案2】:

这不是没有按顺序进行的发送。很可能是收到的。如果主题是分区的(现在是默认设置),我们将在多台机器上分片消息。

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2022-12-19
    • 2021-10-31
    • 2014-11-03
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多