如何回滚微服务之间发生的事务?

bra*_*orm 7 java spring spring-mvc spring-data microservices

我们的microservice建筑大多数microservice都是独立的.但由于某些遗留原因,我们不得不microservice从另一个内部打电话给另一个人.

例如:以下方法是其中的一部分 Legal Service

@Autowired
public ServiceManager UserServiceManager;

public void updateUserLegalData(){

    //do db update of Legal info for the user

   userServiveManager.setAcceptedLegal(true);


}
Run Code Online (Sandbox Code Playgroud)

db transactions上面有两个.一个是更新legalService db,另一个是更新UserService db.请注意userService是microservice在单独的VM上运行的.

我们看到合法服务数据库更新的情况,但调用userService失败(Internal server error).所以这使应用程序处于不一致状态.我们如何以推荐的方式解决这个问题?

谢谢

lub*_*nac 3

这种情况只能用JTA全局/分布式事务来处理。JTA 是 Java EE 标准的一部分,可以有各种实现者。Atomikos 通常是首选工具。

这是 Dave Syer(Spring 生态系统贡献者)的精彩文章。它还包含工作示例。它有点过时了,但仍然有意义。您可以在他的示例之上应用一些更现代的 Spring 抽象。

我为我的书创建了一些JTA 事务的 GitHub 示例。请注意,存在模拟错误并且事务分布在 JMS 和 JDBC 数据源中。

但还要记住,由于涉及两阶段提交算法,跨各种数据源的 JTA 事务速度很慢。人们常常试图避免它们,而是以务实的方式处理不一致的情况。