首页 > 解决方案 > Azure 服务总线:如何在分区队列上启用强制消息排序?

问题描述

在我们的解决方案投入生产后,我们发现我们需要该选项Enforced Message Ordering。队列是分区的(显然是为了冗余)。

如果我尝试打开该Enforced Message Ordering选项,我会收到以下错误:

对于分区队列,仅当 RequiresSession 设置为 true 时才支持排序。

Requires Session选项被禁用(如果不先测试,我不想在生产中以任何方式更改它)。

我应该如何进行?我不认为我们需要分区,但是如果我们可以打开或关闭它,我一无所知。如果可以启用Requires Session这将是一个选项(在测试并可能进行一些代码更改之后),但是是否可以切换Requires Session

我们是否注定要更改我们的代码以使其独立于订单,或者以其他方式设置一个全新的服务总线并让各方切换?

标签: azureservicebusazure-servicebus-queues

解决方案


分区队列是具有 16 个代理实例服务消息的队列。在分区队列上强制执行顺序实际上是不可能的。这就是你得到错误的原因。

不幸的是,启用消息会话不仅仅是勾选另一个框。这意味着更改代码的工作方式,包括发送方和接收方。消息会话强制执行有序的消息传递,并且需要一种稍微不同的方法,其中消息由会话 ID 绑定。这也意味着您无法扩展属于同一会话的消息的处理。

我们是否注定要更改我们的代码以使其独立于订单,或者以其他方式设置一个全新的服务总线并让各方切换?

我建议分析订购消息的要求,看看你是否真的需要它。消息传递和订单不能很好地融合在一起。在某些情况下,当它真正需要的顺序时,与 Azure 服务总线的会话是可行的方法,但它需要一种非常特定的方式来处理它们。

处理无序到达且需要协调工作的消息的另一种选择是实现一种模式,例如 Coordinator/ Process Manager或 Saga。NServiceBusMassTransit等库提供了 saga 实现,您可以看看。


推荐阅读