当前位置: 首页 > 知识库问答 >
问题:

Spring引导分散事务

井逸明
2023-03-14

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

这是问题陈述。

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

  1. 学生服务(STU DB)

在复合服务用例中,用户(管理员)可以为特定课程的学生指派老师。

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

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

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

AssignStaff(resquest){

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


} 

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

共有1个答案

杜曜灿
2023-03-14

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

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

微服务体系结构通常是一个分布式系统。分布式系统中的事务很难处理(请参阅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上有一些关于微服务中事务的讨论。只需搜索或检查。

  • 微服务中的分布式事务
  • 微服务中的交易
  • 跨REST微服务的事务

你有什么选择

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

  • 你真的需要在你的项目中运行ACID风格的事务——也就是说,你坚持你需要你描述的事务行为。然后,您需要跨越服务上的事务。然后,如果服务通过Rest通信,您可以考虑例如NARAYANA REST AT(http://jbossts.blogspot.com/2011/03/rest-cloud-and-transactions.html,从这里开始查看quickstarthttps://github.com/jbosstm/quickstart/tree/master/rts)
  • 您放松了对原子性的要求,然后您可以定制一些事务模型来放松一致性(您可以最终保持一致性)。你可以考虑例如LRA(https://github.com/eclipse/microprofile-lra/blob/master/spec/src/main/asciidoc/microprofile-lra-spec.adoc)(不幸的是,规范和实现还没有准备好,但PoC可以在当前状态下运行。)
  • 您希望使用一种完全不同的方法来处理事务。然后你可以调查事件来源。您可以部署Apache Kafka,并将更新事件发送到事件存储。每个服务都将读取这些事件,并在DBs中独立更新
 类似资料:
  • 我使用的是Spring Boot 1.4.2中的spring-boot-starter-data-jpa。 一切都很好(@Entity classes discovery、datasource自动配置、transaction自动配置、EntityManager自动配置)。

  • 我是Java和Spring Boot的初学者,我在Spring Boot上使用< code>Pagination,用这个代码我返回用户列表,如果我想返回页数,我必须这样做? 我知道使用我可以获取页数,但如何返回它?

  • 在Consul,可以查看SpringBoot应用程序中配置的健康状态。 或者我们是否可以让Consult拉出/调用某个服务的任何服务/URL,以便在Consult中查看响应?

  • 我试图从我的Spring启动服务向IBMMQ队列发送消息。配置如下: 一个pplication.properties 菜豆 IBM MQ浏览器图片 当我尝试发送消息时,我收到错误: 我错过了什么?我的chammel类型所显示的错误与我的请求不符,但我不知道这意味着什么。 提前谢谢。

  • 到处玩弄Spring Boot,我无法显示jsp页面。有daos等工作,所以没有probs那里,但我不能为我的生活使它显示一个简单的jsp页面(没有数据传入,只是一个简单的页面) 我尝试在/resources/meta-inf/resources/WEB-INF/jsp和/webapp/WEB-INF/view中添加JSP 误差

  • 我有一个带应用程序的spring boot应用程序。属性文件和spring数据jpa。在应用程序中,我有一个外部依赖项,需要加载外部Spring项目的bean,该项目具有基于xml的配置。外部xml有自己的组件扫描和spring jpa设置,可以与应用程序中提供该DB属性的其他DB进行交互。属性文件,我正在使用@ImportResources将其bean注入父应用程序。但是,当我在做这个sprin