Azure 服务总线有序处理消息

Posted

技术标签:

【中文标题】Azure 服务总线有序处理消息【英文标题】:Azure Service Bus ordered processing of message 【发布时间】:2020-07-20 15:07:45 【问题描述】:

如果对于 Azure 服务总线主题,则存在带有某个过滤器的单一订阅。有一个微服务 A 为订阅创建了一个SubscriptionClient,并发度为 1 用于读取消息。此外,如果此服务 A 有 2 个这样的副本,并且假设在 t1、t2 和 t3 时间插入到主题的 unpartitioned 服务总线主题中有 3 条消息。

t1 < t2 < t3

    在 t1 被传递到 Replica-1 之前,t2 消息是否有可能通过服务总线传递到 Replica-2 ?

    如果不是,在处理订阅和添加消费微服务的副本时,服务总线主题的扩展策略是什么。

注意: 与 kafka 相比,它确保 1 个分区的消息仅传递给一个副本和一个正在侦听该分区的线程,从而保证消息的有序处理。但不确定像 Azure 服务总线这样的服务总线主题,如果多个副本正在使用不同的订阅客户端侦听相同的订阅,它们是否可以接收/处理乱序消息?

【问题讨论】:

【参考方案1】:

如果要使用 Azure 服务总线启用有序消息处理,则必须使用 Sessions

您可以使用消息的SessionId 作为您可能在 Kafka 中使用的 partitionId 的等效项。这样,您仍然可以扩展您的消费者,但在任何给定时间都受到不同 SessionId 值数量的限制。

消息会话。实施需要消息排序或消息延迟的工作流。

会话提供交错消息流的并发解复用,同时保持和保证有序传递。

当多个并发接收者从队列中拉取时,属于特定会话的消息被分派到当前持有该会话锁定的特定接收者。通过该操作,一个队列或订阅中的交错消息流被清晰地解复用到不同的接收者,并且这些接收者也可以存在于不同的客户端机器上,因为锁管理发生在服务端,在服务总线内。

Service Bus Partitions 将负载分散到多个节点,并且不提供任何排序​​保证。

分区意味着分区实体的整体吞吐量不再受单个消息代理或消息存储的性能限制。此外,消息存储的临时中断不会导致分区队列或主题不可用。

【讨论】:

除了使用 azure 服务总线主题进行排序的会话之外,如果我们必须使用没有会话的主题 - 想出一个解决方法,在开始时进行 shouldStart 检查,这将检查是否存在是一些像 DB 这样的有状态存储中的一些乱序消息。如果找到,将丢弃此消息并安排相同的消息在某个时间后重试,预计到那时之前的消息会被处理。继续这样做,直到重试计数器用完指数退避。

以上是关于Azure 服务总线有序处理消息的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线队列消息处理

Azure 服务总线队列以并行方式异步处理消息

顺序处理算法/模式 - Azure 服务总线队列

Azure 服务总线 - 删除特定消息

如何使用标准 Azure 逻辑应用的无状态工作流可靠地处理 Azure 服务总线消息

失败的消息不会从 Azure 服务总线触发函数移动到 DLQ