【问题标题】:how to implement outbox like pattern with third party api如何使用第三方 api 实现类似发件箱的模式
【发布时间】: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


【解决方案1】:

不要重新发明轮子。使用像 temporal.io 这样的协调器来实现你的逻辑。您可以完全按照您的要求编写代码:

await createItemOnProvider()
await publishMessage()

Temporal 将确保两条线在出现任何故障(包括进程崩溃和网络中断)的情况下都能完成执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多