1

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

  • 发票
  • 银行转帐:调用外部 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

所有这些都是发票服务应用程序的一部分Workflow但是现在银行转账服务和账本服务Activity不再依赖 pub-sub,而是提供 API 来处理转账(在银行转账方面,它实际上是外部银行调用的代理 API),账本服务提供 API 来创建借记/贷记杂志。CMIIW,在这种情况下,我们不再需要在银行转账服务账本服务上创建监听器(或节奏/时间活动) ,我们需要提供 API。

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

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

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

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

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

在 cadence / Temporal中,这是合适的用例吗?如果是这样,如何处理上述问题?

谢谢

4

1 回答 1

0

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

问题 1

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

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

问题2

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

问题 3

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

问题 4

通过确保工作流代码最终完成,临时性使得支持补偿操作变得微不足道。这是来自Java SDK Samples 存储库的SAGA 示例

问题 5

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

于 2021-09-21T19:58:17.620 回答