CN113312187B - 基于双向链表的消息多线程消费顺序确认的方法及装置 - Google Patents
基于双向链表的消息多线程消费顺序确认的方法及装置 Download PDFInfo
- Publication number
- CN113312187B CN113312187B CN202110612637.6A CN202110612637A CN113312187B CN 113312187 B CN113312187 B CN 113312187B CN 202110612637 A CN202110612637 A CN 202110612637A CN 113312187 B CN113312187 B CN 113312187B
- Authority
- CN
- China
- Prior art keywords
- message
- linked list
- state
- node
- head
- 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
Images
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/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
- 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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了基于双向链表的消息多线程消费顺序确认的方法,所述方法包括以下步骤:步骤S1、创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;步骤S2、主服务从消息中心中拉取消息;步骤S3、取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;步骤S4、本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;步骤S5、双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞;本发明能够实现即使多线程消费消息,也能保证后续的消息确认是按顺序操作的,同时任务不需要相互等待。
Description
技术领域
本发明涉及计算机技术领域,特别是基于双向链表的消息多线程消费顺序确认的方法及装置。
背景技术
在重要场景下(如支付回调处理),要求消费的业务消息绝不能丢失,且能充分利用高规格的服务器的性能,比如用线程池对业务消息进行快速处理。同时为了支持高并发,常用的技术方案是用消息队列来对业务解耦、对流程异步化以及削峰填谷;但是,由于引入了这个技术,也增加了系统的复杂度和不稳定因素,比如消息可靠性的保障,这个保障需贯穿消息流转的每个环节,比如生产端的事务型消息、消费端的手动应答确认(ACK)等。本发明重点关注消费端的手动ACK机制,其技术难度是需确保手动ACK顺序和消息顺序的一致性。
消息队列之所以性能高处理快,是因为采用了文件顺序读写方式,系统在拉取消息进行消费时,是按顺序文件的偏移量(offset)进行拉取的,如果commit offset的顺序错乱,会使得服务端的消息状态错乱,比如消息重发。因此,如果服务启动了线程池,对消息进行拉取处理,由于各线程的处理速度不一定一致,所以无法保证各线程处理完之后对各自消息的ACK操作是顺序的。
传统的解决方案是:提交一批任务,批量等待统一提交,缺点很明显,相互等待,极大牺牲服务器性能。
发明内容
为克服上述问题,本发明的目的是提供一种能够实现即使多线程消费消息,也能保证后续的消息确认是按顺序操作的,同时任务不需要相互等待的基于双向链表的消息多线程消费顺序确认的方法。
本发明采用以下方案实现:基于双向链表的消息多线程消费顺序确认的方法,所述方法包括以下步骤:
步骤S1、创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;
步骤S2、主服务从消息中心中拉取消息;
步骤S3、取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;
步骤S4、本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;
步骤S5、双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
进一步的,所述步骤S4进一步具体为:待处理业务服务完成消息消费后,异步通知双向链表,双向链表更新状态,状态为完成消费。
进一步的,所述步骤S5进一步具体为:双向链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;是,则同时完成消息应答确认,否,则未完成消息应答确认。
本发明还提供基于双向链表的消息多线程消费顺序确认的装置,包括创建模块、拉取消息模块、执行模块、通知模块和提交模块,所述创建模块,即创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;所述拉取消息模块,即主服务从消息中心中拉取消息;所述执行模块,即取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;所述通知模块,即本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;所述提交模块,即双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
进一步的,所述通知模块进一步具体为:待处理业务服务完成消息消费后,异步通知双向链表,双向链表更新状态,状态为完成消费。
进一步的,所述提交模块进一步具体为:双向链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;是,则同时完成消息应答确认,否,则未完成消息应答确认。
本发明的有益效果在于:本发明可有效利用本地线程资源,并行的处理业务逻辑,并通过队列和异步通知机制保证最终commit offset时的有序性,可使得服务器性能能到更加充分的利用。
附图说明
图1是本发明的方法流程示意图。
图2是本发明的装置原理框图。
具体实施方式
下面结合附图对本发明做进一步说明。
请参阅图1所示,本发明的基于双向链表的消息多线程消费顺序确认的方法,所述方法包括以下步骤:
步骤S1、创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;
步骤S2、主服务从消息中心中拉取消息;
步骤S3、取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;
步骤S4、本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;
步骤S5、双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
下面提供一实施例对本发明作进一步说明:
步骤1:创建双端队列(双向链表模块),队列包含两个关键属性:处理状态state、对应消息的offset(偏移量)。
双向链表队列内部实现了同步和锁的机制,保证消息能严格按顺序应答确认。
步骤2:主服务从消息中心中拉取消息;主服务指业务处理服务,如支付系统的回调处理服务,所述消息中心指消息中间件(开源软件),如RabbitMQ;
图中标识的1:拉取消息。
步骤3:取得消息后先入队列(双向链表模块)尾部,再将消息提交本地线程池(处理业务逻辑)执行。如队列尾部,主要是为了保证执行的顺序,“先入先出”。
图中标识的2:添加到处理队列队尾;3:处理业务逻辑(多线程)。
步骤4:本地业务逻辑处理完成(消息消费完成),通知双向链表模块对应节点,更新状态为完成。
图中标识的4:处理完成;5:处理完成通知。双向链表中消息等待线程节点接收到处理完成通知,变更状态(state)=true,如果当前节点是头部节点,则唤醒阻塞,否则不做操作。具体实现过程中,是把双向链表模块封装为通用服务,有其对应的数据库表结构;消息消费完成通知双向链表模块,其实是往模块对应的消息表中插入一条数据来实现,模块会按照时间顺序,轮询库表,取得数据入链表。
步骤5:队列头(第一个节点)被更新后出队列,提交offset,并判断新的队列头的状态,直到遇到state是未完成的head时阻塞。常用的链表分为带头结点和不带头结点。带头结点的链表中head的数据项为空,而不带头的链表直接在头结点存入数据,那么当从头插入数据时,head需要时刻变化,比如删除第一个结点:head=head->next,这时需要改变链表的头结点;本发明用的链表是不带头结点的,这边体现的队列头,其实是第一个结点的意思。
图中标识的6:唤醒阻塞;7:消息应答确认。如果第一个节点(head)的状态(state)=true,则commit offset,并出队列,判断新的head的state,如果是true,则继续出队列,如果是false则等待唤醒。
所述唤醒阻塞为当某个条件满足的时候,执行某个线程中操作;当某个条件不满足的时候,将当前的线程挂起,等待这个条件满足的时候,其他的线程唤醒当前线程。
总之,本发明是一种基于双向链表的消息多线程消费顺序确认的方法及装置,实现即使多线程消费消息,也能保证后续的消息确认是按顺序操作的,同时任务不需要相互等待。具体的实现思路如下:先创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;处理业务服务取得消息后,入链表尾部;待处理业务服务完成消息消费后,异步通知双向链表;链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;如消息出队,同时完成消息应答确认。因为双向链表队列内部实现了同步和锁的机制,保证消息能严格按顺序应答确认。
请参阅图2所示,本发明还提供基于双向链表的消息多线程消费顺序确认的装置,包括创建模块、拉取消息模块、执行模块、通知模块和提交模块,所述创建模块,即创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;所述拉取消息模块,即主服务从消息中心中拉取消息;所述执行模块,即取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;所述通知模块,即本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;所述提交模块,即双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
所述通知模块进一步具体为:待处理业务服务完成消息消费后,异步通知双向链表,双向链表更新状态,状态为完成消费。
所述提交模块进一步具体为:双向链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;是,则同时完成消息应答确认,否,则未完成消息应答确认。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (6)
1.基于双向链表的消息多线程消费顺序确认的方法,其特征在于,所述方法包括以下步骤:
步骤S1、创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;
步骤S2、主服务从消息中心中拉取消息;
步骤S3、取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;
步骤S4、本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;
步骤S5、双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
2.根据权利要求1所述的基于双向链表的消息多线程消费顺序确认的方法,其特征在于:所述步骤S4进一步具体为:待处理业务服务完成消息消费后,异步通知双向链表,双向链表更新状态,状态为完成消费。
3.根据权利要求1所述的基于双向链表的消息多线程消费顺序确认的方法,其特征在于:所述步骤S5进一步具体为:双向链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;是,则同时完成消息应答确认,否,则未完成消息应答确认。
4.基于双向链表的消息多线程消费顺序确认的装置,其特征在于:包括创建模块、拉取消息模块、执行模块、通知模块和提交模块,所述创建模块,即创建双向链表,队列节点维护自身处理状态和对应消息的偏移量;所述拉取消息模块,即主服务从消息中心中拉取消息;所述执行模块,即取得消息后,先入双向链表尾部,再将消息提交至本地线程中执行;所述通知模块,即本地业务逻辑将消息处理完成后,通知双向链表对应节点,更新状态;所述提交模块,即双向链表的队列头部被更新后出队列,提交offset,并判断新的队列头部的状态;直至遇到state是未完成的head时阻塞。
5.根据权利要求4所述的基于双向链表的消息多线程消费顺序确认的装置,其特征在于:所述通知模块进一步具体为:待处理业务服务完成消息消费后,异步通知双向链表,双向链表更新状态,状态为完成消费。
6.根据权利要求4所述的基于双向链表的消息多线程消费顺序确认的装置,其特征在于:所述提交模块进一步具体为:双向链表等待节点接受处理完成通知变更状态,并判断当前节点是否头部节点及其状态,决定是否出队;是,则同时完成消息应答确认,否,则未完成消息应答确认。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110612637.6A CN113312187B (zh) | 2021-06-02 | 2021-06-02 | 基于双向链表的消息多线程消费顺序确认的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110612637.6A CN113312187B (zh) | 2021-06-02 | 2021-06-02 | 基于双向链表的消息多线程消费顺序确认的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113312187A CN113312187A (zh) | 2021-08-27 |
CN113312187B true CN113312187B (zh) | 2023-06-16 |
Family
ID=77377101
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110612637.6A Active CN113312187B (zh) | 2021-06-02 | 2021-06-02 | 基于双向链表的消息多线程消费顺序确认的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113312187B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101350959A (zh) * | 2008-07-24 | 2009-01-21 | 中兴通讯股份有限公司 | 一种多路信息异地处理并返回的实现方法和装置 |
CN102223681A (zh) * | 2010-04-19 | 2011-10-19 | 中兴通讯股份有限公司 | 一种物联网系统及其中缓存的控制方法 |
CN103475569A (zh) * | 2013-09-09 | 2013-12-25 | 北京思特奇信息技术股份有限公司 | 一种消息队列存储转发方法及装置 |
CN104243417A (zh) * | 2013-06-18 | 2014-12-24 | 上海博达数据通信有限公司 | 基于多核的pppoe实现方法 |
CN107273228A (zh) * | 2017-07-13 | 2017-10-20 | 焦点科技股份有限公司 | 基于星型拓扑架构的消息传输方法 |
CN108595282A (zh) * | 2018-05-02 | 2018-09-28 | 广州市巨硅信息科技有限公司 | 一种高并发消息队列的实现方法 |
CN110598054A (zh) * | 2019-08-19 | 2019-12-20 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6785674B2 (en) * | 2003-01-17 | 2004-08-31 | Intelitrac, Inc. | System and method for structuring data in a computer system |
-
2021
- 2021-06-02 CN CN202110612637.6A patent/CN113312187B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101350959A (zh) * | 2008-07-24 | 2009-01-21 | 中兴通讯股份有限公司 | 一种多路信息异地处理并返回的实现方法和装置 |
CN102223681A (zh) * | 2010-04-19 | 2011-10-19 | 中兴通讯股份有限公司 | 一种物联网系统及其中缓存的控制方法 |
CN104243417A (zh) * | 2013-06-18 | 2014-12-24 | 上海博达数据通信有限公司 | 基于多核的pppoe实现方法 |
CN103475569A (zh) * | 2013-09-09 | 2013-12-25 | 北京思特奇信息技术股份有限公司 | 一种消息队列存储转发方法及装置 |
CN107273228A (zh) * | 2017-07-13 | 2017-10-20 | 焦点科技股份有限公司 | 基于星型拓扑架构的消息传输方法 |
CN108595282A (zh) * | 2018-05-02 | 2018-09-28 | 广州市巨硅信息科技有限公司 | 一种高并发消息队列的实现方法 |
CN110598054A (zh) * | 2019-08-19 | 2019-12-20 | 桂林长海发展有限责任公司 | 一种多线程链表处理方法、装置及计算机可读存储介质 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
Also Published As
Publication number | Publication date |
---|---|
CN113312187A (zh) | 2021-08-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10453010B2 (en) | Computer device, method, and apparatus for scheduling business flow | |
US10002161B2 (en) | Multithreading and concurrency control for a rule-based transaction engine | |
CN110196856B (zh) | 一种分布式数据读取方法及装置 | |
US5742830A (en) | Method and apparatus for performing conditional operations on externally shared data | |
US8549538B2 (en) | Coordinating communication medium state for subtasks | |
US8132171B2 (en) | Method of controlling thread access to a synchronization object | |
US20130067495A1 (en) | Managing processes within suspend states and execution states | |
US9588576B2 (en) | Managing processes within suspend states and execution states | |
CN111078422A (zh) | 消息处理方法、消息处理装置、可读存储介质、电子设备 | |
CN112241400A (zh) | 一种基于数据库实现分布式锁的方法 | |
US8046780B1 (en) | Efficient processing of assets with multiple data feeds | |
CN113312187B (zh) | 基于双向链表的消息多线程消费顺序确认的方法及装置 | |
CN115617908A (zh) | 一种MySQL数据同步方法、装置、数据库终端、介质及系统 | |
CN117407182B (zh) | 一种基于Poll指令的进程同步方法、系统、设备及介质 | |
EP1700203B1 (en) | Behavioral model based multi-threaded architecture | |
CN113051279A (zh) | 数据消息的存储方法、存储装置、电子设备及存储介质 | |
US8276147B2 (en) | Low synchronization means of scheduler finalization | |
CN115687491A (zh) | 一种基于关系型数据库的数据分析任务调度系统 | |
CN108418879B (zh) | 一种高可靠性的海量异构数据传输方法及系统 | |
CN116662035A (zh) | 消息队列事务消息的处理方法和装置 | |
CN116302368A (zh) | 一种分布式事务处理方法、装置、设备及存储介质 | |
CN112131238A (zh) | 一种交易状态机设计方法、处理装置和处理方法 | |
CN112596761A (zh) | 服务的更新发布方法、装置及相关设备 | |
CN118394826A (zh) | 一种具备细粒度特性的多线程etl方法 | |
Armendáriz et al. | Design of a MidO2PL Database Replication Protocol in a Middleware Architecture |
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 |