在一个RESTful微服务架构中,ACID是如何工作的?

6

我在实施微服务架构方面比较新,这个问题困扰着我:

微服务架构如何处理不同端点调用之间的事务机制。

一个例子是基于微服务架构的银行服务。基本上,银行操作需要不同的服务来完成交易,如果其中一个服务失败,那么就没有办法消除部分进程,我不知道是否有解决这个问题的机制。

创建付款

POST /payments/customer/10/payment/100/

从账户中扣款

PUT /customers/10/accounts/20

向客户发送通知

POST /alerts/customers/10


最终一致性和协调。在这种情况下,一级记录可能是一个事务,该事务被发布到日志中,然后消费者负责更新下游记录,如客户余额和发送警报。 - chrylis -cautiouslyoptimistic-
我觉得你提到采用抵制而不是取消的观点很有趣。 - J Brain
1个回答

3
答案是,你的API没有暴露出任何方法来创建无效状态。
每个方法必须完成完整且有效的交易。例如,与其拥有添加和删除账户余额的方法,你需要有转账方法。在转账过程中必须完成(或至少排队)任何必要的记录或通知。
有时,这要求你为某些本来可能被认为是不完整的交易创建特殊的“有效”状态。例如,在预订电影院座位时,有一种状态,即你的座位已被预定,直到一定时间(大约5分钟),如果你还未支付,则座位将被释放。

我理解你的意思,但是如果有不同的微服务在不同的服务器上运行,并且每个微服务都与一个或多个存储系统交互,同时它们之间也相互交互,如果其中一个微服务失败了,应该如何处理这种情况?我的意思是要回到已经启动的进程。 - J Brain
1
通常的答案是,微服务应该只能完成完整且有效的交易。跨多个微服务的操作可以通过事务性消息队列或在事务性存储中交换信息来进行编排。这再次创建了新的“有效状态”。如果服务1执行操作A导致服务2执行操作B,则除了持久的“A和B已完成”状态外,您可能还需要一个“A已完成,B已经被耐心地排队并保证很快完成”的状态。 - Matt Timmermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接