Spring Boot分布式事务

时间:2019-07-09 05:14:52

标签: spring-boot java-ee distributed-transactions

我们需要找到解决微服务架构中分布式事务管理的最佳方法。

这是问题陈述。

我们有一个Composite微服务,它将与基础的其他2个Atomic微服务(显然是为特定目的而定)进行交互,并具有独立的数据库,例如我们可以将这两个微服务视为

  1. STUDENT_SERVICE(STU_DB)
  2. TEACHER_SERVICE(TEACHR_DB)

在“复合服务用例”中,用户(管理员)可以为特定课程等向学生分配教师。

我想知道如何在一个事务中解决这个问题,因为每个服务(STUDENT_SERVICE和TEACHER_SERVICE)都有单独的数据库,并且所有事务都应在一个事务中进行,即提交或回滚。

由于这两个服务是分开的,我认为JTA不会有帮助,因为这意味着将这两个应用程序(服务)部署在同一应用程序服务器上!

我选择了如上所述的JTA //伪代码  类CompositeService {

AssignStaff(resquest){

//txn Start
updateStudentServiceAPI(request);
UpdateTeacherServiceAPI(request);
//txn End
}


} 

执行api后系统应处于一致状态

1 个答案:

答案 0 :(得分:0)

这是一个棘手的问题,即使乍一看并不明显。

您所要求的功能被认为是微服务体系结构的反模式。

微服务体系结构通常是分布式系统。分布式系统中的事务很难处理(请参见https://martin.kleppmann.com/2015/09/26/transactions-at-strange-loop.html)。您的应用程序包含两个服务。

JTA是用于ACID样式事务的Java API。 ACID事务通常需要在数据库中建立锁。当事务跨越多个服务(在您的情况下为两个)时,一个服务的故障可能会阻止另一服务的处理。在这种情况下,您将失去微服务架构的优势-服务的松散耦合和独立性。您最终可以构建一个分布式整体(请参见不错的文章https://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/)。

顺便说一句。在Stackoverflow上有一些关于微服务中事务主题的讨论。只需搜索或检查例如

您有什么选择

(免责声明:我是http://narayana.io的开发人员,介绍的选项是从Java EE和Narayana的角度来看的。可能还有其他项目提供类似的功能。此外,即使Narayana与Spring很好地集成,您可能也需要处理一些集成问题。)