CN113760470B - 一种基于事务消息及反查实现分布式事务的方法及系统 - Google Patents
一种基于事务消息及反查实现分布式事务的方法及系统 Download PDFInfo
- Publication number
- CN113760470B CN113760470B CN202111054256.7A CN202111054256A CN113760470B CN 113760470 B CN113760470 B CN 113760470B CN 202111054256 A CN202111054256 A CN 202111054256A CN 113760470 B CN113760470 B CN 113760470B
- Authority
- CN
- China
- Prior art keywords
- message
- transaction
- local
- order
- transactions
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 16
- 238000005096 rolling process Methods 0.000 claims abstract description 20
- 230000005856 abnormality Effects 0.000 claims abstract description 8
- 238000012795 verification Methods 0.000 claims description 12
- 230000000977 initiatory effect Effects 0.000 claims description 7
- 230000001427 coherent effect Effects 0.000 claims description 5
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012552 review Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/466—Transaction processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/547—Messaging middleware
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Computer And Data Communications (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种基于事务消息及反查实现分布式事务的方法,所述方法包括以下步骤:步骤S1、消息发送方给消息服务端发送一个半消息;步骤S2、半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;步骤S3、根据本地事务的执行结果决定将半消息提交或回滚事务消息;步骤S4、在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务;本发明能够利用事务消息保证分布性事务性,并通过增加事务反查机制来解决事务消息提交失败问题。
Description
技术领域
本发明涉及计算机技术领域,特别是一种基于事务消息及反查实现分布式事务的方法及系统。
背景技术
本方法是在订单系统中实施,在该系统中创建订单的过程中实际上执行了2个步骤的操作(如下图1):
(1)在订单库中插入一条订单数据,创建订单;
(2)发消息给消息队列,消息的内容就是刚刚创建的订单。
购物车系统订阅相应的主题,接收订单创建的消息,然后清理购物车,在购物车中删除订单中的商品。问题的关键点集中在订单系统,创建订单和发送消息这两个步骤要么都操作成功,要么都操作失败,不允许一个成功而另一个失败的情况出现。即有要有一个方案能够保证分布式事务的可靠性,常用的技术方案是分布式锁的机制,一定程度上面可以保障操作的原子性和一致性,但是牺牲了效率(性能),尤其在高并发的场景下,容易出现死锁等情况。
发明内容
为克服上述问题,本发明的目的是提供一种能够利用事务消息保证分布性事务性,并通过增加事务反查机制来解决事务消息提交失败问题的方法。
本发明采用以下方案实现:一种基于事务消息及反查实现分布式事务的方法,所述方法包括以下步骤:
步骤S1、消息发送方给消息服务端发送一个半消息;
步骤S2、半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;
步骤S3、根据本地事务的执行结果决定将半消息提交或回滚事务消息;
步骤S4、在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务。
进一步的,所述步骤S1进一步具体为:消息发送方给消息服务端发送一个半消息,所述半消息为消息的完整内容,且对于消费者不可见。
进一步的,所述步骤S2进一步具体为:半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行本地事务,所述本地事务为业务性质的操作,如在订单库中创建一条订单记录,并提交订单库的数据库事务,所述数据库事务为连贯性的操作,业务发起,数据库执行。
进一步的,所述步骤S3进一步具体为:根据本地事务的执行结果决定将半消息提交或回滚事务消息,判断订单是否创建成功,是,则将事务消息提交至消息服务端,否,则回滚事务消息。
进一步的,所述步骤S4进一步具体为:反查本地事务并不依赖消息发送方,消息服务端通过其他订单服务的节点数据来执行反查,确保本地事务的完整性。
本发明还提供了一种基于事务消息及反查实现分布式事务的系统,包括发送模块、告知模块、决定模块和反查模块,所述发送模块,即消息发送方给消息服务端发送一个半消息;所述告知模块,即半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;所述决定模块,即根据本地事务的执行结果决定将半消息提交或回滚事务消息;所述反查模块,即在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务。
进一步的,所述发送模块进一步具体为:消息发送方给消息服务端发送一个半消息,所述半消息为消息的完整内容,且对于消费者不可见。
进一步的,所述告知模块进一步具体为:半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行本地事务,所述本地事务为业务性质的操作,如在订单库中创建一条订单记录,并提交订单库的数据库事务,所述数据库事务为连贯性的操作,业务发起,数据库执行。
进一步的,所述决定模块进一步具体为:根据本地事务的执行结果决定将半消息提交或回滚事务消息,判断订单是否创建成功,是,则将事务消息提交至消息服务端,否,则回滚事务消息。
进一步的,所述反查模块进一步具体为:反查本地事务并不依赖消息发送方,消息服务端通过其他订单服务的节点数据来执行反查,确保本地事务的完整性。
本发明的有益效果在于:本发明实现订单系统中分布式操作事务的一致性要求,同时通过事务反查的机制解决了事务消息提交失败的问题,即使是发送事务消息的那个订单服务节点宕机了,消息队列依然可以通过其他订单服务的节点来执行反查,确保事务的完整性;同时具备更好的性能指标。
附图说明
图1为现有技术流程示意图。
图2是本发明的方法流程示意图。
图3是本发明的系统原理框图。
具体实施方式
下面结合附图对本发明做进一步说明。
请参阅图2所示,本发明的一种基于事务消息及反查实现分布式事务的方法,所述方法包括以下步骤:
步骤S1、消息发送方给消息服务端发送一个半消息;
步骤S2、半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;
步骤S3、根据本地事务的执行结果决定将半消息提交或回滚事务消息;
步骤S4、在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务。
下面通过一具体实施例对本发明作进一步说明:
步骤1:消息发送方如订单系统消息模块客户端给消息服务端发送一个半消息(Half),这个半消息包含的内容是完整的消息内容,和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的。订单系统消息模块客户端由客户端和服务端构成,一般会引入消息中间件,如RocketMQ等进行构建;订单系统生成的消息推送给消息模块,消息模块会实时告知接受结果。
步骤2:半消息发送成功后,告知订单系统,该系统开始执行本地事务,如在订单库中创建一条订单记录,并提交订单库的数据库事务。这边的本地事务就是特指业务性质的操作,如发起订单付款操作,跟下面提到的数据库事务是连贯性的操作,业务发起,数据库执行。如发起付款,就会触发“在订单库中创建一条订单记录”;因此本案例中数据库事务完成后会反馈本地事务结果,本地事务以数据库事务结果来给用户做反馈,如提示订单创建失败等。
数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。比如本发明提到的“在订单库中创建一条订单记录”,这个简单的操作在订单系统中可能涉及账户余额的预扣款、日志的更新等一系列的数据库操作,那么必须保障全部的数据库操作序列都成功或都不成功,需要放在一个事务中执行。
步骤3:根据本地事务的执行结果决定提交或者回滚事务消息。如果订单创建成功,那就提交事务消息至消息服务端。如果订单创建失败,那就回滚事务消息,这样就基本实现了要么都成功,要么都失败的一致性要求。回滚事务消息,是指如果步骤2创建订单数据库保存没有成功的情况下,通知消息服务端操作失败,不需要向消息订阅方(如果购物车系统)发送消息,直接删除本条消息即可。
步骤4:如果在提交或者回滚事务消息时发生网络异常,消息服务端没有收到提交或者回滚的请求,消息服务端会定期去消息发送方(订单系统消息模块)上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。
这个反查本地事务的实现,并不依赖消息的发送方,也就是订单服务的某个实例节点上的任何数据。这种情况下,即使是发送事务消息的那个订单服务节点宕机了,消息队列依然可以通过其他订单服务的节点来执行反查,确保事务的完整性。
事务反查机制的实现需要业务代码中实现一个反查本地事务状态的接口,告知消息队列本地事务是成功还是失败。比如在本发明提到的订单系统中,反查本地事务的逻辑只要根据消息中的订单ID,在订单库中查询这个订单是否存在即可,如果订单存在则返回成功,否则返回失败。消息队列会自动根据事务反查的结果,提交或者回滚事务消息。
另外这个反查本地事务的实现,并不依赖消息的发送方,也就是订单服务的某个实例节点上的任何数据。这种情况下,即使是发送事务消息的那个订单服务节点宕机了,消息队列依然可以通过其他订单服务的节点来执行反查,确保事务的完整性。
总之,本发明适用的场景主要是那些需要异步更新数据,并且对数据实时性要求不太高的场景,比如在背景中提到的订单系统这个实施案例,在创建订单后,如果出现短暂的1-2秒,购物车里的商品没有及时删除,一定程度上也是允许的设计,只要最终购物车的数据和订单数据保持一致就可以。其总体思路是通过消息队列中的事务,解决消息生产者和消息消费者的数据一致性问题;利用事务消息保证分布式事务性;并通过增加事务反查机制来解决事务消息提交失败的问题,即使是发送事务消息的订单服务节点宕机了,消息服务依然可以通过其他订单服务的节点来执行反查,确保事务的完整性。
请参阅图3所示,本发明还提供了一种基于事务消息及反查实现分布式事务的系统,包括发送模块、告知模块、决定模块和反查模块,所述发送模块,即消息发送方给消息服务端发送一个半消息;所述告知模块,即半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;所述决定模块,即根据本地事务的执行结果决定将半消息提交或回滚事务消息;所述反查模块,即在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务。
所述发送模块进一步具体为:消息发送方给消息服务端发送一个半消息,所述半消息为消息的完整内容,且对于消费者不可见。
所述告知模块进一步具体为:半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行本地事务,所述本地事务为业务性质的操作,如在订单库中创建一条订单记录,并提交订单库的数据库事务,所述数据库事务为连贯性的操作,业务发起,数据库执行。
所述决定模块进一步具体为:根据本地事务的执行结果决定将半消息提交或回滚事务消息,判断订单是否创建成功,是,则将事务消息提交至消息服务端,否,则回滚事务消息。
所述反查模块进一步具体为:反查本地事务并不依赖消息发送方,消息服务端通过其他订单服务的节点数据来执行反查,确保本地事务的完整性。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (8)
1.一种基于事务消息及反查实现分布式事务的方法,其特征在于,所述方法包括以下步骤:
步骤S1、消息发送方给消息服务端发送一个半消息;
步骤S2、半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;
步骤S3、根据本地事务的执行结果决定将半消息提交或回滚事务消息;
步骤S4、在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务;
所述步骤S4进一步具体为:反查本地事务并不依赖消息发送方,消息服务端通过其他订单服务的节点数据来执行反查,确保本地事务的完整性。
2.根据权利要求1所述的一种基于事务消息及反查实现分布式事务的方法,其特征在于:所述步骤S1进一步具体为:消息发送方给消息服务端发送一个半消息,所述半消息为消息的完整内容,且对于消费者不可见。
3.根据权利要求1所述的一种基于事务消息及反查实现分布式事务的方法,其特征在于:所述步骤S2进一步具体为:半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行本地事务,所述本地事务为业务性质的操作,如在订单库中创建一条订单记录,并提交订单库的数据库事务,所述数据库事务为连贯性的操作,业务发起,数据库执行。
4.根据权利要求1所述的一种基于事务消息及反查实现分布式事务的方法,其特征在于:所述步骤S3进一步具体为:根据本地事务的执行结果决定将半消息提交或回滚事务消息,判断订单是否创建成功,是,则将事务消息提交至消息服务端,否,则回滚事务消息。
5.一种基于事务消息及反查实现分布式事务的系统,其特征在于:包括发送模块、告知模块、决定模块和反查模块,所述发送模块,即消息发送方给消息服务端发送一个半消息;所述告知模块,即半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行半消息的本地事务;所述决定模块,即根据本地事务的执行结果决定将半消息提交或回滚事务消息;所述反查模块,即在半消息提交或回滚事务消息时发生网络异常,消息服务端没有收到提交半消息或回滚的请求,消息服务端会定期反查消息发送方对应的本地事务状态,根据反查结果决定提交或回滚本地事务;
所述反查模块进一步具体为:反查本地事务并不依赖消息发送方,消息服务端通过其他订单服务的节点数据来执行反查,确保本地事务的完整性。
6.根据权利要求5所述的一种基于事务消息及反查实现分布式事务的系统,其特征在于:所述发送模块进一步具体为:消息发送方给消息服务端发送一个半消息,所述半消息为消息的完整内容,且对于消费者不可见。
7.根据权利要求5所述的一种基于事务消息及反查实现分布式事务的系统,其特征在于:所述告知模块进一步具体为:半消息发送成功后,告知消息服务端的订单系统,订单系统开始执行本地事务,所述本地事务为业务性质的操作,如在订单库中创建一条订单记录,并提交订单库的数据库事务,所述数据库事务为连贯性的操作,业务发起,数据库执行。
8.根据权利要求5所述的一种基于事务消息及反查实现分布式事务的系统,其特征在于:所述决定模块进一步具体为:根据本地事务的执行结果决定将半消息提交或回滚事务消息,判断订单是否创建成功,是,则将事务消息提交至消息服务端,否,则回滚事务消息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111054256.7A CN113760470B (zh) | 2021-09-09 | 2021-09-09 | 一种基于事务消息及反查实现分布式事务的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111054256.7A CN113760470B (zh) | 2021-09-09 | 2021-09-09 | 一种基于事务消息及反查实现分布式事务的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113760470A CN113760470A (zh) | 2021-12-07 |
CN113760470B true CN113760470B (zh) | 2023-11-03 |
Family
ID=78794145
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111054256.7A Active CN113760470B (zh) | 2021-09-09 | 2021-09-09 | 一种基于事务消息及反查实现分布式事务的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113760470B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1822533A (zh) * | 2006-03-27 | 2006-08-23 | 阿里巴巴公司 | 一种可靠的系统间消息通知方法和系统 |
CN105824842A (zh) * | 2015-01-07 | 2016-08-03 | 阿里巴巴集团控股有限公司 | 分布式事务处理方法及其系统 |
CN106775959A (zh) * | 2016-12-06 | 2017-05-31 | 上海亿账通互联网科技有限公司 | 分布式事务处理方法和系统 |
EP3333727A1 (en) * | 2016-02-24 | 2018-06-13 | Huawei Technologies Co., Ltd. | Transaction execution method, apparatus, and system |
CN109408203A (zh) * | 2018-11-01 | 2019-03-01 | 无锡华云数据技术服务有限公司 | 一种队列消息一致性的实现方法、装置、计算系统 |
CN112698969A (zh) * | 2020-12-30 | 2021-04-23 | 佰年颐堂医疗科技股份有限公司 | 一种基于消息落库的mq消息可靠性投递解决方法 |
CN112882801A (zh) * | 2021-01-28 | 2021-06-01 | 广州衣科明夷信息技术有限公司 | 一种基于mq的分布式事务实现方法 |
-
2021
- 2021-09-09 CN CN202111054256.7A patent/CN113760470B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1822533A (zh) * | 2006-03-27 | 2006-08-23 | 阿里巴巴公司 | 一种可靠的系统间消息通知方法和系统 |
CN105824842A (zh) * | 2015-01-07 | 2016-08-03 | 阿里巴巴集团控股有限公司 | 分布式事务处理方法及其系统 |
EP3333727A1 (en) * | 2016-02-24 | 2018-06-13 | Huawei Technologies Co., Ltd. | Transaction execution method, apparatus, and system |
CN106775959A (zh) * | 2016-12-06 | 2017-05-31 | 上海亿账通互联网科技有限公司 | 分布式事务处理方法和系统 |
CN109408203A (zh) * | 2018-11-01 | 2019-03-01 | 无锡华云数据技术服务有限公司 | 一种队列消息一致性的实现方法、装置、计算系统 |
CN112698969A (zh) * | 2020-12-30 | 2021-04-23 | 佰年颐堂医疗科技股份有限公司 | 一种基于消息落库的mq消息可靠性投递解决方法 |
CN112882801A (zh) * | 2021-01-28 | 2021-06-01 | 广州衣科明夷信息技术有限公司 | 一种基于mq的分布式事务实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN113760470A (zh) | 2021-12-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7480918B2 (en) | Duplicate message elimination during recovery when multiple threads are delivering messages from a message store to a destination queue | |
CN110888893A (zh) | 一种基于微服务电商系统的订单处理方法 | |
CN111459575B (zh) | 调用请求的处理方法、装置和计算机存储介质 | |
CN108038767B (zh) | 基于消息队列的电商订单异步分发系统及方法 | |
CN111752957A (zh) | 一种基于缓存化的销售锁定方法及系统 | |
CA2375376A1 (en) | Collision avoidance in bidirectional database replication | |
CN110888718A (zh) | 分布式事务的实现方法及装置 | |
US8006248B2 (en) | Method, apparatus and computer program for facilitating communication between a client application and a server application | |
CN111784329B (zh) | 业务数据的处理方法和装置、存储介质、电子装置 | |
CN112817995B (zh) | 数据处理方法和装置、电子设备及存储介质 | |
CN113094362B (zh) | 一种异步消息可靠投递和处理的方法和装置 | |
CN112053149A (zh) | 一种防止重复支付的方法、装置、电子设备和可读存储介质 | |
CN105183879A (zh) | 一种云计算下分布式数据库保持事务一致性的方法 | |
CN108762895B (zh) | 处理分布式事务的方法及装置 | |
CN115220876A (zh) | 虚拟资源创建方法、装置、程序产品、介质及电子设备 | |
CN113760470B (zh) | 一种基于事务消息及反查实现分布式事务的方法及系统 | |
CN112822091A (zh) | 一种消息处理方法和装置 | |
CN112927073A (zh) | 跨链数据互换方法、系统、装置、电子设备 | |
CN111143041B (zh) | 一种数据一致性方法、分布式协调器及中央协调器 | |
CN112116471A (zh) | 一种证券算法交易过程中的实时算法交易总线系统 | |
CN114612204A (zh) | 对账方法及装置 | |
CN114579260A (zh) | 一种事务处理方法及系统 | |
CN110764933B (zh) | 一种消息处理方法、装置、系统及计算设备 | |
CN112463887A (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN111581446B (zh) | 一种图关系生成方法、装置、系统、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |