【问题标题】:How do you support FIFO message ordering with Azure Service Bus partitioned queues/topics?如何使用 Azure 服务总线分区队列/主题支持 FIFO 消息排序?
【发布时间】:2015-01-23 16:25:22
【问题描述】:

我假设使用分区队列和主题的权衡是不再保证消息顺序。

由于默认情况下消息是循环发送到每个片段/分区的,因此这意味着消息的顺序不再得到保证。有人可以确认是不是这样吗?

从分区队列接收交易时如何保证消息排序。

是使用会话来支持分区队列/主题的 FIFO 消息排序的唯一方法吗?我会假设同一个会话/分区键的所有消息至少会被 FIFO 传递?

【问题讨论】:

标签: azure servicebus azureservicebus


【解决方案1】:

我在一篇博文中发现了这一点。

希望对你有帮助!

Partitioned Service Bus Queues and Topics

会话 ID。如果消息设置了 SessionId 属性,则服务总线使用 SessionId 属性作为分区键。这样,属于同一会话的所有消息都分配给同一片段并由同一消息代理处理。这允许服务总线保证消息顺序以及会话状态的一致性。

【讨论】:

    【解决方案2】:

    仅仅因为您没有使用分区队列或主题并不意味着您将获得 FIFO。如果您有多个阅读器或执行异步操作,则不会,除非您使用上面指出的 Sessions,否则您将不会获得 FIFO。请使用会话。

    【讨论】:

      【解决方案3】:

      上面的答案中缺少关于 FIFO 的重要一点。

      当消息进入未启用分区的主题/队列时,会观察到 FIFO 以进行消息传递*。

      当您在主题/队列上启用分区并且 SessionId 用于分区键时,消息不再保证彼此之间是 FIFO,它们只是 保证相对于他们被划分到的分区是先进先出

      有趣的事实是,如果您对同一订阅/队列的订阅者数量较少,分区读取器分配通常是循环方式完成的,并且如果您有更多的分区,那么分区通常会产生一些有趣的副作用订阅者,您可以看到消息被饿死(需要 SB 团队的验证,这是我自己完成的测试的经验,因为我的消息被饿死了)。


      * 正如@Dan Rosanova 上面指出的,如果您有异步处理或多个阅读器,那么您的消息 processing 不能保证是 FIFO,但消息的顺序是分配给处理器将是 FIFO。

      当您使用 Session 消息处理程序(需要填充 SessionId)时,您将更进一步,并保证消息按顺序处理,就像 Session消息处理程序锁定 SessionId+MessageId 而不仅仅是 MessageId,从而确保同一会话中的其他消息不会被另一个处理器接收。

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多