【发布时间】:2023-01-22 10:52:52
【问题描述】:
我正在实现与第三方系统的集成,我无法控制它,并在第三方系统上进行一些更新后使用 rabbitmq 作为消息队列发布消息,我的实现如下场景
await createItemOnProvider()
await queue.publishMessage()
如果我实现数据库更新并想在成功后发布消息,我使用发件箱模式来处理这种情况,但在当前情况下,我需要使其成为原子的,但没有事务包装器来处理这两种情况,我不确定在这种情况下应该使用什么模式,例如,如果发布消息失败,该怎么办?
【问题讨论】:
-
你能澄清一下数据流吗?据我了解,某些应用程序 A(您无法控制)会更新 Ua 并在完成后发布一条消息。您的应用程序 B 读取消息,在其一侧更新 Ub 并将另一条消息发布到队列。并且您希望 Ua 和 Ub 是原子的(两者都发生或根本不发生)。我做对了吗?
-
感谢您的回复,我想让另一个系统上发生的更新和我发布的消息是原子的,这里有两种可能的情况:第一种情况:系统 (A) 成功更新,然后消息将发布成功第二种情况:系统(A)更新失败,不会发布消息第三种情况:系统(A)修改成功,但是发布消息时出现问题,如何保证消息发布成功地?
-
但为什么如果你说你不控制A,那是你的顾虑?你不应该关心他们那边发生了什么(事实上,你甚至不知道,A 对你来说只是一个“带有公共 API 的黑匣子”),你应该构建你自己的系统,考虑到可能的不一致。
-
我不关心 (A) 系统,我关心的是万一我调用 (A) 系统并进行了更新,然后我无法将消息发布到我的系统
-
如果只是您端发布的消息失败了 - 只需重复它(如果由于网络相关问题而失败,可能会有一些回退),重复直到成功。无论如何,你的系统只是最终与A一致,所以没有非凡的发生了,不是吗?
标签: microservices software-design distributed-system saga outbox-pattern