当前位置: 首页 > 知识库问答 >
问题:

架构问题-Azure servicebus和消息顺序保证

束帅
2023-03-14

好吧,我对servicebus还比较陌生。在一个项目中,我们使用Azure servicebus对消息进行排队。我们的架构大致如下所示:

因此,我们的想法是,在我们的源系统中,发生了各种各样的事情,这导致消息被放在servicebustopics上。现在,我们的责任是将这些事件同步到外部客户机,以便他们知道我们在做什么。

现在的问题是,目前我们不使用servicebus会话,所以消息顺序无法保证。还要考虑以下场景:

OrderCreated OrderUpdate 1 OrderUpdate 2订单关闭

现在发生的情况是,如果OrderUpdate 1和OrderUpdate 2的externalclients API关闭,我们可能会按顺序发送消息:OrderCreated、OrderClosed、OrderUpdate 1、OrderUpdate 2。

目前,我们只是重试消息几次,然后它进入死信队列进行手动重新处理。

我们应该采取哪些步骤来更好地保证邮件的顺序?我觉得在订单的范围内,需要保证消息的顺序。

我们是否应该强制sourcesystem将订单的所有消息放入servicebus会话中?但我们如何处理多个主题?如果会话中的消息1以死信结尾,我们该怎么办?

这里有很多考虑因素,我们是否应该使用单个主题,以便更容易管理会话?但是,这打开了不同的消息结构在一个主题中的其他问题?

我很想听听你对此的看法

共有2个答案

令狐声
2023-03-14

如果外部客户机必须接收所有这些事件和订单事项,那么将这些消息发送到多个主题,其中每个主题是每种消息类型,这将使您的任务非常难以完成。对于有序消息传递,首先需要使用启用会话的单个实体(队列或主题)。这样,您就可以保证有序的消息处理。如果您有多个外部客户机,则需要为每个外部客户机启用一个会话实体(主题)。

另一个选项是实现称为流程管理器的模式。流程经理将负责对传入的消息做出决定,并在给定订单的工作完成或未完成时做出结论。

还有一些库(MassTransit、NServiceBus等)可以帮助您。NServiceBus通过一个名为Saga(教程)的功能实现了流程管理器,MassTransit也有它(留档)。

景理
2023-03-14

查看Azure中的持久函数。您可以使用异步Http API或其他模式之一来实现您需要执行的业务流程。NServicebus的Sagas也可能是一个不错的选择,这里有一篇文章很好地比较了NServicebus和持久函数。

 类似资料:
  • 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。 面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -

  • 主要内容:面试题剖析,解决方案面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。 你在 mysql 里增删改一条数据,对应出来了增删改

  • 阅读这篇关于主题分区中消息排序的文章:https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2 允许在不设置最大值的情况下重试。航班请求。每连接到1可能会更改记录的顺序,因为如果将两个批发送到单个分区,第一个失败并重试,但第二个成功,则第二个批中的记录可能会首先出现。 根

  • 主要内容:1 start启动服务定时锁定消息队列,1.2 lockAll锁定所有消息队列,2 submitConsumeRequest提交消费请求,3 ConsumeRequest执行消费任务,3.1 tryLockLaterAndReconsume尝试延迟加锁并重新消费,3.2 takeMessages拉取消息,4 processConsumeResult处理消费结果,4.1 commit提交消息,4.2 checkReconsumeTimes检查重试次数,,,基于RocketMQ relea

  • 假设我有一个包含3个应用程序的流——一个源、处理器和接收器。 我需要保留从源收到的消息的顺序。当我收到消息A,B,C,D,我必须将它们作为A,B,C,D.发送到接收器(我不能将它们作为B,A,C,D)发送。 如果每个应用程序只有一个实例,那么一切都将按顺序运行,并且顺序将被保留。 如果我每个应用程序有 10 个实例,则消息 A、B、C、D 可能会在不同的实例中同时处理。我不知道这些消息的顺序是什么

  • 我正在调查,看看骆驼是否能满足以下要求。要求是:传入队列上的消息顺序应该与传出队列上的消息顺序相匹配。 谢谢你的帮助。