Azure 服务总线:如何在分区队列上启用强制消息排序?

Azure Service Bus: How to enable Enforced Message Ordering on a partitioned queue?

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

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

For a Partitioned Queue, ordering is supported only if RequiresSession is set to true.

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

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

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

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

不幸的是,

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

Are we doomed to change our code to make it independent of the order, or otherwise set up a whole new Service bus and get all parties to switch?

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

处理乱序到达且需要协调工作的消息的另一种选择是实施一种模式,例如 Coordinator/Process Manager or Saga. Libraries such as NServiceBus and MassTransit offer saga implementation 你可以看看。