【问题标题】:Spring boot Distrubuted transactionSpring Boot 分布式事务
【发布时间】:2023-03-22 04:15:01
【问题描述】:

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

这是问题陈述。

我们有一个复合微服务,它应该与底层的其他 2 个原子微服务交互(这显然是为了特定目的)并有单独的数据库,例如我们可以将这两个微服务视为

  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执行后系统应处于一致状态

【问题讨论】:

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


    【解决方案1】:

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

    您要求的功能被理解为微服务架构的反模式。

    微服务架构通常是一个分布式系统。分布式系统中的事务是困难的(参见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 很好地集成,您也可能需要处理一些集成问题。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2019-01-25
      • 2017-05-02
      • 2019-12-26
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多