Spring boot Spring引导分布式事务

Spring boot Spring引导分布式事务,spring-boot,jakarta-ee,distributed-transactions,Spring Boot,Jakarta Ee,Distributed Transactions,我们需要找到在我们的微服务体系结构中解决分布式事务管理的最佳方法 这是问题陈述 我们有一个复合微服务,它将与其他2个原子微服务(特别是用于特定目的)交互,并且具有单独的数据库,例如,我们可以将这2个微服务视为 学生服务(STU DB) 教师服务(教师数据库) 在复合服务用例中,用户(管理员)可以为特定课程的学生分配教师等 我想知道我们如何在一个事务中解决这个问题,因为每个服务(学生服务和教师服务)都有单独的数据库,所有这些都应该在一个事务中发生,要么提交,要么回滚 由于这两个服务是独立的,我认为

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

这是问题陈述

我们有一个复合微服务,它将与其他2个原子微服务(特别是用于特定目的)交互,并且具有单独的数据库,例如,我们可以将这2个微服务视为

  • 学生服务(STU DB)
  • 教师服务(教师数据库)
  • 在复合服务用例中,用户(管理员)可以为特定课程的学生分配教师等

    我想知道我们如何在一个事务中解决这个问题,因为每个服务(学生服务和教师服务)都有单独的数据库,所有这些都应该在一个事务中发生,要么提交,要么回滚

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

    如上所述,我选择了JTA //伪码 类复合服务{

    AssignStaff(resquest){
    
    //txn Start
    updateStudentServiceAPI(request);
    UpdateTeacherServiceAPI(request);
    //txn End
    }
    
    
    } 
    

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

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

    您需要的功能被理解为微服务体系结构的反模式

    微服务架构通常是一个分布式系统。分布式系统中的事务很难处理(请参阅)。您的应用程序由两个服务组成

    JTA是用于ACID类型事务的Java API。ACID事务通常需要在数据库中建立锁。因为事务跨越多个服务(在您的情况下,有两个)然后,一个服务的故障可能会阻止另一个服务的处理。在这种情况下,您将失去微服务体系结构的优势——服务的松散耦合和独立性。您最终可能会构建一个分布式整体(参见nice文章)

    顺便说一句,在Stackoverflow这里有一些关于微服务中事务的讨论

    你有什么选择

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

      <>你确实需要在你的项目中运行酸性风格的事务-你坚持你需要按你所描述的方式处理事务行为,然后你需要跨越事务跨越服务。然后如果服务通过REST通信,你可以考虑例如NARAYANA REST AT(开始查看这里的快速入门)。 <> LI>你放宽了原子性的要求,然后你可以加入一些事务模型来放松一致性(你可以很好地保持一致)。你可以考虑例如LRA()。(不幸的是,规范和实现还没有准备好,但是POC可以在当前状态下运行。)
    • 您希望使用一种完全不同的方法来处理事务。然后您可以调查事件来源。您可以部署Apache Kafka等,并将更新事件发送到事件存储。每个服务都将从DBs中独立读取这些事件和更新