CN110442461B - 一种消息投递方法、存储介质 - Google Patents
一种消息投递方法、存储介质 Download PDFInfo
- Publication number
- CN110442461B CN110442461B CN201910623774.2A CN201910623774A CN110442461B CN 110442461 B CN110442461 B CN 110442461B CN 201910623774 A CN201910623774 A CN 201910623774A CN 110442461 B CN110442461 B CN 110442461B
- Authority
- CN
- China
- Prior art keywords
- message
- successfully
- disk
- client
- middleware
- 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
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/547—Messaging middleware
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明提供一种消息投递方法、存储介质,方法包括:预设各个消息对应的ID;消息中间件接收消息后存至本地内存;消息中间件定时将本地内存中的消息存至磁盘;成功将本地内存中的消息存至磁盘后,写所述消息对应的ID列表至回调客户端的通知接口。本发明不仅能提高消息投递成功提示的准确性;而且能确保消息百分百投递成功;进一步地,还能有效避免消息重复投递。
Description
技术领域
本发明涉及消息中间件的应用领域,具体涉及一种消息投递方法、存储介质。
背景技术
消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。具体而言,发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。
然而,现有很多MQ消息中间件中,为了保证消息投递成功不丢失,又做了很多措施。其中一个措施就是消息持久化,写入MQ中的消息,即使MQ宕机重启了,还能够读取消息出来。而怎样保持消息持久化成功,需要预先保证消息能够正常写入MQ软件中,很多的MQ软件都提供了一个confirm机制,即为当MQ接收到消息后,会返回给客户端一个ack(确认字符),告知其消息已经收到了。可是,这就能保证消息在MQ中一定能持久化,记录至文件中嘛?答案是不能。因为,一般MQ为了保证自身的高吞吐,都是临时写入消息至本地内存中,在一定时间之后,才会刷内存中的数据至磁盘中,即刷盘处理。而此时,如果记录在内存中的数据,在写入磁盘之前,MQ宕机或者重启等,则消息会丢失,无法保证消息一定投递成功。
因此,有必要提供一种能够确保消息投递成功的方法。
发明内容
本发明所要解决的技术问题是:提供一种消息投递方法、存储介质,提高消息投递成功提示的准确性。
为了解决上述技术问题,本发明采用的技术方案为:
一种消息投递方法,包括:
预设各个消息对应的ID;
消息中间件接收消息后存至本地内存;
消息中间件定时将本地内存中的消息存至磁盘;
成功将本地内存中的消息存至磁盘后,写所述消息对应的ID列表至回调客户端的通知接口。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时,能够实现上述消息投递方法所包含的步骤。
本发明的有益效果在于:本发明改变消息中间件本地持久化存储过程中消息发送成功的提示方式,在成功刷消息至磁盘后再通过回调接口通知批量消息投递成功,之后,即使消息中间件宕机或者重启,消息也不会丢失,从而提高消息投递成功提示的准确性,确保消息真正的不丢失。
附图说明
图1为本发明实施例一种消息投递方法的流程示意图;
图2为本发明实施例一所述消息投递方法的流程示意图。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
本发明最关键的构思在于:在成功刷消息至磁盘后再通过回调接口通知批量消息投递成功,提高消息投递成功提示的准确性,确保消息真正的不丢失。
请参照图1,本发明提供一种消息投递方法,包括:
预设各个消息对应的ID;
消息中间件接收消息后存至本地内存;
消息中间件定时将本地内存中的消息存至磁盘;
成功将本地内存中的消息存至磁盘后,写所述消息对应的ID列表至回调客户端的通知接口。
由上述可知,本发明的有益效果在于,预先存储消息至本地存储文件中,后续进行消息发送,统一不根据MQ消息中间件返回的ack与nack标志来判断是否消息已经发送成功,而是采用MQ刷盘成功后回调的接口通知方式来真正进行消息的ack,采用这样的方式,能保证重点的消息一定能够投递成功,保证了消息的不丢失性。
进一步地,还包括:
客户端接收所述通知接口发送过来的ID列表后,设置所述ID列表对应的消息的状态为发送成功或者删除所述ID列表对应的消息。
由上述描述可知,客户端依据回调通知接口及时而准确地标记已经成功投递的消息,有效避免消息重复投递,从而提高消息投递的准确性。
进一步地,还包括:
客户端发送消息至消息中间件之前,存储所述消息至本地缓存。
由上述描述可知,客户端将对要发送给消息中间件的消息进行持久化存储,作为备份留底。
进一步地,还包括:
客户端定时查询客户端本地缓存中是否存在未成功存至磁盘的消息;
当依据查询记录确定未成功存至磁盘的消息累积达到预设数量时,将对应的消息重新发送至消息中间件。
由上述描述可知,依据通知接口与备份消息定时查询获取未能投递成功的消息,并批量重新发送,不仅能够保证消息百分百成功投递,而不丢失;并且采用批量重投的方式,能提高效率且不过多占用线程资源。
进一步地,还包括:
依据各个消息对应的ID,设置消息中间件对应其消费端的接口具备幂等性。
由上述描述可知,能保证消息的幂等性,不至于出现同一条消息发送多次而产生业务上的冲突的情况。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时,能够实现上述一种消息投递方法所包含的步骤。
从上述描述可知,对应本领域普通技术人员可以理解实现上述技术方案中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来实现的,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时,可包括如上述各方法的流程。所述程序在被执行后,同样能实现各个程序对应的各方法所能实现的效果。
其中,所述的存储介质可以是磁盘、光碟、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
实施例一
请参照图2,本实施例提供一种消息投递方法,适用于分布式系统中使用消息中间件MQ作为数据可靠传输的场景,以确保消息成功投递而不丢失。
在本实施例中,所述消息中间件可以是kafka或者rabbitmq或者rocketmq或者其他类型的消息中间件。
本实施的方法可以包括以下步骤:
S1:客户端接收到消息之后,在向消息中间件MQ发送消息进行通知之前,进行消息本地持久化保存。
具体而言,客户端接口会将消息写入redis或者mongo之类支持高吞吐的软件中进行消息本地持久化保存。
当客户端写入成功,则执行下一步骤;当客户端写入失败时,根据业务判断失败原因;其中,当写入失败的消息为必定要发送的重要消息时,则整个接口返回写入失败,以便再次写入,保证重要消息成功的进行持久化存储。
S2:客户端本地消息保存成功后,向消息中间件MQ发送存储成功的消息;优选地,无论客户端应答接口返回成功或者失败,该接口的处理流程均结束。
S3:消息中间件MQ接收消息后,进行持久化保存处理。
具体而言,该步骤可以包括:
S31:将接收到的消息存储至消息中间件的本地内存中;
S32:定时将消息中间件本地内存中存储的消息转存至磁盘,即刷消息至磁盘中。前后执行该步骤的时间间隔支持自定义,即依据预设时间间隔刷本地内存的消息至磁盘。
S4:当消息中间件MQ每一次刷盘成功,都需要调用回调接口通知功能,将成功刷盘入库的消息对应的ID列表返回给客户端。目的在于通知客户端已经有哪些消息刷盘持久化成功了。
其中,返回的信息为一个ID列表,由本次成功刷盘入库的各个消息各自对应的ID组成。而各个消息各自对应的ID为预先设置,且每一条消息与其ID为唯一对应关系。
S5:客户端接收到回调接口的通知后,将依据接口中的ID列表设置其用于持久化存储消息的redis或者mongo中对应消息的状态,可选地,可以将消息标志为已经发送成功,或者直接在redis或者mongo中删除对应消息。
本实施通过改变现有的消息投递通知方式,不再是根据MQ返回的ack与nack标志来判断消息是否发送成功;而是采用在MQ成功刷盘接收到的消息后以回调接口通知方式进行消息投递成功的通知,这种方式对应了MQ持久化存储消息以后才进行通知,真正的对应消息投递成功,确保消息不丢失,即使MQ宕机或重启,消息也不会丢失。
实施例二
本实施例在实施例一的基础上做进一步扩展,进一步地保证重要消息百分百投递成功而不丢失。
具体而言,实施例一的方法还包括:
S6:设置一个定时任务,每隔预设时间,比如说10-30秒,查询客户端本地缓存中是否存在未成功存至磁盘的消息,并重新进行消息的发送。
可选地,若客户端能够依据接收到的ID列表更改redis或者mongo中的消息状态,则可以直接依据消息的状态获取未能在消息中间件成功刷入磁盘的消息;
可选地,若客户端不支持及时修改redis或者mongo中的消息状态,则可以依据通知接口接收到的ID列表自行判断其本地缓存中存储的必须要发送的消息是否都已成功投递,进而获取未能在消息中间件成功刷入磁盘的消息。
可选地,查询记录为一定数量限制的查询,比如说每次最多支持查询出50条未能成功投递的消息记录出来,然后重新进行消息的发送。
实施例三
本实施例在实施例一或实施例二的基础上做进一步优化,提供消息处理的可靠性。
具体而言,将对MQ的消费者端进行适当改造,保证消息的幂等性,不会因为同一条消息发送多次,而产生业务上的冲突。
可选地,可以依据各个消息对应的ID,设置消息中间件对应其消费端的接口具备幂等性。因为所有消息均有对应的消息ID,因此,可以依据ID保证,已处理过的消息ID,不会再次被处理。
实施例四
本实施例对应实施例一至实施例三,提供一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时,能够实现上述实施例一至实施例三任意一个实施例所述的一种消息投递方法所包含的步骤。具体的步骤内容在此不进行复述,详情请参阅实施例一至实施例三的记载。
综上所述,本发明提供的一种消息投递方法、存储介质,不仅能提高消息投递成功提示的准确性;而且能确保消息百分百投递成功;进一步地,还能有效避免消息重复投递。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (3)
1.一种消息投递方法,其特征在于,包括:
预设各个消息对应的ID;
客户端发送消息至消息中间件之前,存储所述消息至本地缓存,并判断是否存储成功;
若存储成功,则执行下一步骤;若存储失败,根据业务判断失败原因,并判断存储失败的消息是否为必定要发送的消息,若是则整个接口返回写入失败;
消息中间件接收消息后存至本地内存;
消息中间件定时将本地内存中的消息存至磁盘;
成功将本地内存中的消息存至磁盘后,写所述消息对应的ID列表至回调客户端的通知接口;
客户端接收到回调接口的通知后,将依据接口中的ID列表设置其用于持久化存储消息的redis或者mongo中对应消息的状态:
在MQ成功刷盘接收到的消息后以回调接口通知方式进行消息投递成功的通知;
还包括:
客户端定时查询客户端本地缓存中是否存在未成功存至磁盘的消息;
当依据查询记录确定未成功存至磁盘的消息累积达到预设数量时,将对应的消息重新发送至消息中间件;
若客户端能够依据接收到的ID列表更改redis或者mongo中的消息状态,则直接依据消息的状态获取未能在消息中间件成功刷入磁盘的消息;
若客户端不支持及时修改redis或者mongo中的消息状态,则依据通知接口接收到的ID列表自行判断其本地缓存中存储的必须要发送的消息是否都已成功投递,进而获取未能在消息中间件成功刷入磁盘的消息;
还包括:
依据各个消息对应的ID,设置消息中间件对应其消费端的接口具备幂等性。
2.如权利要求1所述的一种消息投递方法,其特征在于,还包括:
客户端接收所述通知接口发送过来的ID列表后,设置所述ID列表对应的消息的状态为发送成功或者删除所述ID列表对应的消息。
3.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序在被处理器执行时,能够实现上述权利要求1或2所述的一种消息投递方法所包含的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910623774.2A CN110442461B (zh) | 2019-07-11 | 2019-07-11 | 一种消息投递方法、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910623774.2A CN110442461B (zh) | 2019-07-11 | 2019-07-11 | 一种消息投递方法、存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110442461A CN110442461A (zh) | 2019-11-12 |
CN110442461B true CN110442461B (zh) | 2022-10-21 |
Family
ID=68430156
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910623774.2A Active CN110442461B (zh) | 2019-07-11 | 2019-07-11 | 一种消息投递方法、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110442461B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111585774B (zh) * | 2020-03-24 | 2022-02-01 | 福建天泉教育科技有限公司 | 会话更新的方法、存储介质 |
CN112084048B (zh) * | 2020-09-25 | 2024-07-09 | 中国建设银行股份有限公司 | Kafka同步刷盘方法、装置及消息服务器 |
CN113452602B (zh) * | 2021-06-21 | 2023-03-24 | 网易(杭州)网络有限公司 | 消息传输方法、装置、电子设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102868564A (zh) * | 2012-10-10 | 2013-01-09 | 山东中创软件商用中间件股份有限公司 | 一种消息持久化方法及系统 |
CN203574673U (zh) * | 2013-07-15 | 2014-04-30 | 上海联影医疗科技有限公司 | 一种消息处理系统 |
CN108009027A (zh) * | 2017-11-23 | 2018-05-08 | 北京百度网讯科技有限公司 | 队列消息一致性的实现方法、装置、设备及存储介质 |
CN108965355A (zh) * | 2017-05-18 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 用于数据传输的方法、装置及计算机可读存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8799400B2 (en) * | 2011-02-02 | 2014-08-05 | Imvu, Inc. | System and method for managing multiple queues of non-persistent messages in a networked environment |
-
2019
- 2019-07-11 CN CN201910623774.2A patent/CN110442461B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102868564A (zh) * | 2012-10-10 | 2013-01-09 | 山东中创软件商用中间件股份有限公司 | 一种消息持久化方法及系统 |
CN203574673U (zh) * | 2013-07-15 | 2014-04-30 | 上海联影医疗科技有限公司 | 一种消息处理系统 |
CN108965355A (zh) * | 2017-05-18 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 用于数据传输的方法、装置及计算机可读存储介质 |
CN108009027A (zh) * | 2017-11-23 | 2018-05-08 | 北京百度网讯科技有限公司 | 队列消息一致性的实现方法、装置、设备及存储介质 |
Non-Patent Citations (1)
Title |
---|
分布式消息系统研究综述;吴璨等;《计算机科学》;20190630;第46卷(第6A期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110442461A (zh) | 2019-11-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110442461B (zh) | 一种消息投递方法、存储介质 | |
CN111813791B (zh) | 一种分布式补偿事务的方法及设备 | |
CN112367149B (zh) | 消息获取方法、装置、设备及存储介质 | |
US20110173495A1 (en) | Method and System for Reliable Intersystem Message Notification | |
CN110633320A (zh) | 分布式数据服务的处理方法、系统、设备及存储介质 | |
WO2020108325A1 (zh) | 事务处理方法、装置和设备 | |
CN111741060B (zh) | 消息推送方法、装置、计算机设备和存储介质 | |
CN111416823A (zh) | 一种数据传输方法和装置 | |
CN112988883A (zh) | 数据库的数据同步方法、装置以及存储介质 | |
CN112887196B (zh) | 消息发送方法、系统、装置、设备及可读存储介质 | |
CN113064741B (zh) | 一种消息队列重试方法及设备 | |
CN108647105B (zh) | 系统切换过程中的幂等控制方法、装置及系统 | |
CN113448699A (zh) | 一种分布式定时任务处理系统、方法及相关装置 | |
CN114007111B (zh) | 资源分发方法、装置、电子设备及存储介质 | |
CN113645008B (zh) | 一种基于链表的报文协议超时重发方法及系统 | |
CN111431952A (zh) | 消息推送方法、装置及系统,计算机存储介质和电子设备 | |
CN112698969A (zh) | 一种基于消息落库的mq消息可靠性投递解决方法 | |
US20130262589A1 (en) | Communicating per-recipient delivery statuses of multi-recipient messages in multiline simple mail transfer protocol responses | |
CN112865927B (zh) | 消息送达验证方法、装置、计算机设备和存储介质 | |
CN117472627A (zh) | 任务重试管理系统、方法、装置、电子设备及存储介质 | |
CN114567664B (zh) | 消息处理结果监控方法、装置、计算机设备和存储介质 | |
CN107563942B (zh) | 一种物流数据批量处理方法、物流处理系统以及处理装置 | |
CN111478941B (zh) | Mock自动化运行方法、装置、计算机设备及存储介质 | |
CN108243210A (zh) | 一种信息推送方法和信息推送服务器 | |
CN110704208B (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 |