【问题标题】:Temporal / Cadence orchestration concept时间/节奏编排概念
【发布时间】:2021-11-14 22:55:19
【问题描述】:

在当前的应用程序中,我们有三个服务:

  • 发票
  • 银行转帐:调用外部 API,这可能需要一分钟左右,具体取决于队列
  • ledger :创建借记贷记账本的内部微服务

为了交流,我们有一个编排传奇。该流程基本上是使用发票作为编排器:

  1. 发票服务向rabbitmq发布消息,要求支付发票X
  2. 银行转账服务监听消息,获取发票 X
  3. 银行转账服务处理转账(调用银行的API)。支付成功后,向rabbitmq发布消息'Invoice Xpaid'
  4. 发票服务收听消息“发票 X 已付款”
  5. 发票服务发布消息“为发票 X 创建分类帐”并发布到 rabbitmq
  6. 账本服务从 rabbitmq 监听消息“为发票 X 创建账本”
  7. 分类帐服务创建适当的分类帐日记帐借项/贷项,然后发布“为发票 X 创建的分类帐”
  8. 发票服务侦听消息“为发票 X 创建分类帐”,然后完成(关闭)交易

问题 1 如果我使用Temporal 或 cadence(只是在寻找它),它们不会像上面那样依赖 pub-sub 模式。那么如何实现呢?

我在想(CMIIW):

  • 创建InvoiceActivity
  • 创建BankTransferActivity
  • 创建LedgerActivity
  • 创建InvoicePaymentWorkflow

所有WorkflowActivity 都是发票服务应用程序的一部分。但是现在 bank transfer serviceledger service 不再依赖 pub-sub,而是提供 API 来处理转账(就银行转账而言,它实际上是一个代理 API 到外部银行 calll),ledger service 提供 API 来创建借/贷日志。 CMIIW,在这种情况下,我们不再需要在 bank transfer serviceledger service 上创建监听器(或节奏/时间活动),我们需要提供 API。

还是我想错了? 银行转账服务分类帐服务应该有一些活动吗?但如果是这样,发票服务如何触发和安排工作流程?

问题 2 但是现在调用是异步的。日志分类帐创建实际上有一些验证,有时负载很重,因此取决于队列上的消息,从消息到 rabbitmq 到实际创建日志可能需要长达 5 分钟。在 API 调用中,这将是一个超时。

问题 3 那么比赛条件呢?一些期刊要按顺序创建。使用rabbitmq,我们可以通过某种技术来实现这一点(队列中的单个消费者,类似于kafka 主题)。

问题 4 另外,如何处理补偿交易?如果账本失败,我们必须做点什么。在我们的例子中,我们必须通知会计人员,因为银行转帐已经处理并且无法撤消。

问题 5 对于一些子公司,当账本失败时,我们仍然有控制权,因此我们可以补偿/提取发票金额,并将金额返还给母公司。假设我们在银行转账服务上有一个监听器,我们如何触发补偿 API?

按节奏/Temporal,这是合适的用例吗?如果是,如何处理上述问题?

谢谢

【问题讨论】:

    标签: architecture message-queue cadence-workflow temporal-workflow


    【解决方案1】:

    TLDR;此用例非常适合 Temporal,因为它极大地简化了您的代码和操作。

    问题 1

    我建议在他们的代理服务中举办活动。所以InvoiceActivity 应该由发票服务托管,BankTransferActivity 应该由银行转账服务托管。这消除了创建同步 API 的需要,并确保工作流和活动实现之间的流控制。请参阅this post,其中更详细地解释了这一点。

    发票服务应用仅在这种情况下托管工作流代码。

    问题 2

    在相应的服务中托管活动解决了这个问题。时间支持无限期的活动。请注意,建议对长时间运行的活动使用检测信号,以确保及时检测到故障。

    问题 3

    确切的解决方案取决于确切的要求。在大多数情况下,需要特定排序的日记帐分录应该从一个工作流程中进行编排。

    问题 4

    确保工作流代码最终完成的临时性使得支持补偿操作变得微不足道。这是来自Java SDK Samples repositorySAGA example

    问题 5

    只需将此补偿逻辑作为同一工作流程的一部分即可。

    【讨论】: