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

时间:2019-06-04 15:29:10

标签: azureservicebus azure-servicebus-queues

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

如果我尝试打开Enforced Message Ordering选项,则会出现以下错误:

  

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

Requires Session选项被禁用(并且我不想在不先进行测试的情况下在生产中进行任何更改)。

我应该如何进行?我认为我们不需要分区,但是如果可以打开或关闭它,我就处于黑暗之中。如果可以启用Requires Session是一个选择(在测试之后,可能进行了一些代码更改),但是完全可以切换Requires Session吗?

我们是否注定要更改代码以使其与订单无关,还是要设置全新的服务总线并让所有各方切换?

1 个答案:

答案 0 :(得分:1)

分区队列是具有16个代理实例服务消息的队列。在分区队列上强制执行命令实际上是不可能的。这就是为什么您会得到错误。

不幸的是,启用Message Sessions不仅仅是在另一个方框中打勾。这意味着更改发送和接收端代码的工作方式。消息会话强制执行有序消息传递,并且要求消息稍微受会话ID约束的方式略有不同。这也意味着您无法扩展对属于同一会话的消息的处理。

  

我们是否注定要更改代码以使其与订单无关,还是要设置全新的服务总线并让所有各方切换?

我建议您分析订购消息传递的需求,并查看您是否真的需要它。消息传递和订单不能很好地融合在一起。在某些情况下,当真正需要订购时,可以使用与Azure Service Bus进行会话,但是它需要一种非常具体的方式来与之合作。

处理需要协调工作的乱序消息的另一种方法是实现一种模式,例如Coordinator / Process Manager或Saga。 NServiceBusMassTransit之类的库提供了传奇的实现,您可以看一下。