在当前的应用程序中,我们有三个服务:
- 发票
- 银行转帐:调用外部 API,这可能需要一分钟左右,具体取决于队列
- ledger :创建借记贷记账本的内部微服务
为了交流,我们有一个编排传奇。该流程基本上是使用发票作为编排器:
- 发票服务向rabbitmq发布消息,要求支付发票X
- 银行转账服务监听消息,获取发票 X
- 银行转账服务处理转账(调用银行的 API)。付款成功时,向rabbitmq发布消息'Invoice Xpaid'
- 发票服务收听消息“发票 X 已付款”
- 发票服务发布消息“为发票 X 创建分类帐”并发布到 rabbitmq
- 账本服务从 rabbitmq 监听消息“为发票 X 创建账本”
- 分类帐服务创建适当的分类帐日记帐借记/贷记,然后发布“为发票 X 创建的分类帐”
- 发票服务侦听消息“为发票 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中,这是合适的用例吗?如果是这样,如何处理上述问题?
谢谢