我们需要找到解决微服务架构中分布式事务管理的最佳方法。
这是问题陈述。
我们有一个Composite微服务,它将与基础的其他2个Atomic微服务(显然是为特定目的而定)进行交互,并具有独立的数据库,例如我们可以将这两个微服务视为
在“复合服务用例”中,用户(管理员)可以为特定课程等向学生分配教师。
我想知道如何在一个事务中解决这个问题,因为每个服务(STUDENT_SERVICE和TEACHER_SERVICE)都有单独的数据库,并且所有事务都应在一个事务中进行,即提交或回滚。
由于这两个服务是分开的,我认为JTA不会有帮助,因为这意味着将这两个应用程序(服务)部署在同一应用程序服务器上!
我选择了如上所述的JTA //伪代码 类CompositeService {
AssignStaff(resquest){
//txn Start
updateStudentServiceAPI(request);
UpdateTeacherServiceAPI(request);
//txn End
}
}
执行api后系统应处于一致状态
答案 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很好地集成,您可能也需要处理一些集成问题。)