微服务下事物一致性探究
什么是微服务
- 普通IT系统的缺点
- 开发维护成本高
- 各模块互相调用,导致应用的解耦性差
- 容易出现性能瓶颈
- 微服务概念
将所有的服务都进行拆分独立,服务之间互相调用这样实现了
- 服务解耦
- 便于维护
- 代码上的吞吐性大大的增加
微服务架构上结构清晰,但也带来了一定问题比如本文要说的:事物一致性
在单例上只要Translation即可解决
@Translation
public void do(){
updateA();
updateB();
}
但是如果updateA 和 B是分布是不同的服务,对应的数据库也是不同的实例又如何处理呢?
解决办法
-
Translation Controller
image
如图所以在发起一次请求的时候分四步走prepare -> execute -> yes -> 两个都是yes才执行commit
缺点:性能较差,每次都要请求四次
- 消息队列解决方案
- 在A数据库进行update的时候同时生成一条message(消息)当Acommit后对该消息进行发送
- B服务在拿到该消息后验证是否已经执行过,如果没有则执行updateB,然后commit
- 如果在消息发送的时候A服务挂了,导致消息没发送,则需要一个《消息确认系统》来做这块的工作,在服务重启后,对该操作进行查找是否发送了消息,如果没有则继续发送
- 完美实现了消息和应用的解耦
网友评论