azureservicebus - Azure 服务总线:如何在分区队列上启用强制消息排序?
问题描述
在我们的解决方案投入生产后,我们发现我们需要该选项Enforced Message Ordering
。队列是分区的(显然是为了冗余)。
如果我尝试打开该Enforced Message Ordering
选项,我会收到以下错误:
对于分区队列,仅当 RequiresSession 设置为 true 时才支持排序。
该Requires Session
选项被禁用(如果不先测试,我不想在生产中以任何方式更改它)。
我应该如何进行?我不认为我们需要分区,但是如果我们可以打开或关闭它,我一无所知。如果可以启用Requires Session
这将是一个选项(在测试并可能进行一些代码更改之后),但是是否可以切换Requires Session
?
我们是否注定要更改我们的代码以使其独立于订单,或者以其他方式设置一个全新的服务总线并让各方切换?
解决方案
分区队列是具有 16 个代理实例服务消息的队列。在分区队列上强制执行顺序实际上是不可能的。这就是你得到错误的原因。
不幸的是,启用消息会话不仅仅是勾选另一个框。这意味着更改代码的工作方式,包括发送方和接收方。消息会话强制执行有序的消息传递,并且需要一种稍微不同的方法,其中消息由会话 ID 绑定。这也意味着您无法扩展属于同一会话的消息的处理。
我们是否注定要更改我们的代码以使其独立于订单,或者以其他方式设置一个全新的服务总线并让各方切换?
我建议分析订购消息的要求,看看你是否真的需要它。消息传递和订单不能很好地融合在一起。在某些情况下,当它真正需要的顺序时,与 Azure 服务总线的会话是可行的方法,但它需要一种非常特定的方式来处理它们。
处理无序到达且需要协调工作的消息的另一种选择是实现一种模式,例如 Coordinator/ Process Manager或 Saga。NServiceBus和MassTransit等库提供了 saga 实现,您可以看看。
推荐阅读
- bash - Bash 范围变量不返回结果
- android - 如何在没有图像的联系人上显示自定义图标?
- matlab - 在 matlab 中解决“NaN”的建议。在 Matlab 中处理大数和小数
- r - 为什么左截断生存分析中风险集的数字会下降
- c++ - 只有字符串作为输入的回文测试函数
- r - 意外和不一致的行为`c`连接双打/整数与日期
- reactjs - 我在我的投资组合中的平板电脑和移动视图中的布局有问题,并且元素显示不正确
- google-apps-script - 谷歌应用脚本通知工作表特定选项卡上的更改?
- python - 如何在连接四游戏中采取行动 - 请参阅下面的代码
- sql-server - 使用 ODBC 将数据从 Microsoft SQL 迁移到 Elasticsearch