CN107038075A - 消息队列系统以及实现消息通信的方法 - Google Patents
消息队列系统以及实现消息通信的方法 Download PDFInfo
- Publication number
- CN107038075A CN107038075A CN201510413284.1A CN201510413284A CN107038075A CN 107038075 A CN107038075 A CN 107038075A CN 201510413284 A CN201510413284 A CN 201510413284A CN 107038075 A CN107038075 A CN 107038075A
- Authority
- CN
- China
- Prior art keywords
- message
- buffering area
- standby
- buffering
- area
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Hardware Redundancy (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请实施例公开了一种消息队列系统。该系统包括:第一缓冲区、第二缓冲区和持久化存储区;第一缓冲区和第二缓冲区位于消息生产者和消息消费者所在的服务器的内存中,第二缓冲区包括主缓冲区和备缓冲区;第一缓冲区用于缓存消息生产者推送的消息,并存储在持久化存储区中,将已存储到持久化存储区的消息发送给第二缓冲区;持久化存储区用于对第一缓冲区发送的消息进行持久化存储;备缓冲区用于缓存第一缓冲区发送的消息;主缓冲区用于将自身的消息传递给消息消费者,在将自身的消息全部传递给消息消费者之后,与备缓冲区进行主备切换。通过本申请,可以提高消息在消息队列系统中传输的实时性。本申请实施例还公开了一种实现消息通信的方法。
Description
技术领域
本申请涉及计算机领域,特别是涉及消息队列系统以及实现消息通信的方法。
背景技术
在计算机系统中,消息队列是实现不同进程间通信或者同一进程中的不同线程间通信的一种重要方式。也就是说,不同的进程之间或不同的线程之间在消息队列中完成消息传输。
在现有的相关技术中,已经存在多种关于消息队列系统的实现方案。其中一个方案为,消息队列系统由进程(或线程)所在的服务器上的缓存区以及本地磁盘构成。其中,先将消息生产者推送的消息存储在该缓存区中,当该缓存区中的消息个数达到配置值或者消息的发布时间超过阈值时,再将该缓存区中的消息存储到本地磁盘中,以保证消息的可靠性。并且只有存储到本地磁盘中的消息才可以被进一步传递给消息消费者。另外,由于本地磁盘的存储空间有限,存储在本地磁盘中的消息无论是否被传递给消息消费者,其在保留一定时间后就会被删除,以便释放本地磁盘的存储空间。所谓“可靠性”就是指,消息生产者推送到消息队列系统中的消息不丢失,即使消息队列系统故障也可以被恢复;并且,消息在未被传递给消息消费者之前可以一直保存在消息队列系统中,直到被传递给消息消费者为止。
在第一个方案中,只有位于本地磁盘的消息才可以被传递给消息消费者,而消息在被存储到本地磁盘之前,还必须先被存储在缓存区中,因此,消息传输的实时性会比较差。并且,消息是从本地磁盘传递给消息消费者的,受到本地磁盘的IO操作速度的影响,消息传输的实时性就会更差。另外,由于本地磁盘中的消息会被定期删除,因此消息的可靠性也非常差。
另一个方案为:消息队列系统由进程(或线程)所在的服务器上的内存以及位于该服务器外部的数据库构成。其中,先将消息生产者推送的消息存储在内存中,再将消息从内存中传递给消息消费者。并且,为了保证消息的可靠性,还将内存中的消息存储到数据库中。显然,在第二个方案中,消息直接从内存传递到消息消费者,并且,内存的IO操作速度比本地磁盘的IO操作速度快,因此,相较于第一个方案,消息传输的实时性更好。另外,由于数据库的存储空间比较大,存储在数据库中的消息不会被定期删除,因此,相较于第一个方案,消息的可靠性也更好。
但是,在实现本申请的过程中,本申请的发明人发现现有技术中至少存在如下问题:虽然在第二个方案中,内存的IO操作速度比较快,使其消息在消息队列系统中传输的实时性相较于第一个方案好。但是,由于内存不支持同时执行读/写操作,因此,在将消息生产者推送的消息存储在内存中的同时,就不能将消息从内存中传递给消息消费者,这样会很大程度地影响消息传输的实时性。
另外,在第二个方案中,如果消息消费者无法正常地从消息队列系统接收消息或者只能以很慢的速度接收消息,并且消息生产者生产消息的速度又非常快,这样就会有越来越多的消息占满内存,严重时会发生内存溢出。当发生内存溢出时,溢出的消息会被丢弃掉,以至于溢出的消息无法正常传递给消息消费者。
发明内容
为了解决上述技术问题,本申请实施例提供了消息队列系统、以及实现消息通信的方法,以解决现有技术中由于内存不支持同时执行读/写操作而影响消息在消息队列系统中传输的实时性的问题。另外,进一步解决现有技术中由于消息队列系统中的内存发生内存溢出而导致溢出的消息无法正常地被传递给消息消费者的问题。
本申请实施例公开了如下技术方案:
一种消息队列系统,包括:第一缓冲区、第二缓冲区以及持久化存储区;其中,所述第一缓冲区和第二缓冲区位于消息生产者和消息消费者所在的服务器的内存中,所述第二缓冲区包括主缓冲区和备缓冲区;
所述第一缓冲区,用于缓存消息生产者推送的消息,将消息生产者推送的消息存储到所述持久化存储区中,并将已存储到所述持久化存储区的消息发送给所述第二缓冲区;
所述持久化存储区,用于通过持久化存储介质对所述第一缓冲区发送的消息进行持久化存储;
所述备缓冲区,用于缓存所述第一缓冲区发送的消息;
所述主缓冲区,用于将位于所述主缓冲区的消息传递给消息消费者,在将位于所述主缓冲区的消息全部传递给消息消费者之后,与所述备缓冲区进行主备切换。
优选的,所述备缓冲区还用于,在缓存所述第一缓冲区发送的消息之前,检查自身是否存在内存溢出,如果存在内存溢出,丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态,如果不存在内存溢出,继续缓存所述第一缓冲区发送的消息;
所述主缓冲区还用于,在与所述备缓冲区进行主备切换之前,检查所述备缓冲区的当前状态是否为正常状态,如果为非正常状态,不与所述备缓冲区进行主备切换,而从所述持久化存储区中读取消息,并将读取的消息传递给消息消费者,如果为正常状态,继续与所述备缓冲区进行主备切换。
优选的,所述主缓冲区还用于,在从所述持久化存储区中读取消息之后,判断在所述备缓冲区中是否存在下一个读取的消息,如果存在,将所述备缓冲区的当前状态标记为正常状态,如果不存在,维持所述备缓冲区的当前状态。
优选的,所述持久化存储区位于所述服务器外部的分布式文件系统中。
优选的,所述主缓冲区和备缓冲区为同构的缓冲区。
优选的,所述消息生产者和消息消费者为运行在所述服务器上的两个进程或者为运行在所述服务器上的一个进程中的两个线程。
一种实现消息通信的方法,预先在消息生产者和消息消费者所在的服务器的内存中建立第一缓冲区和第二缓冲区,所述第二缓冲区包括主缓冲区和备缓冲区,所述方法包括:
第一缓冲区缓存消息生产者推送的消息,将消息生产者推送的消息存储到持久化存储区中,以便将所述消息持久化地存储在所述持久化存储区中;
第一缓冲区将已存储到所述持久化存储区的消息发送给第二缓冲区;
备缓冲区缓存第一缓冲区发送的消息;
主缓冲区将位于主缓冲区的消息传递给消息消费者,在将位于所述主缓冲区的消息全部传递给消息消费者之后,与备缓冲区进行主备切换。
优选的,所述方法还包括:
在缓存第一缓冲区发送的消息之前,备缓冲区检查自身是否存在内存溢出,如果存在内存溢出,丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态;
在与备缓冲区进行主备切换之前,主缓冲区检查备缓冲区的当前状态是否为正常状态,如果为非正常状态,不与备缓冲区进行主备切换,而从持久化存储区中读取消息,以便将读取的消息传递给消息消费者;
则所述备缓冲区缓存第一缓冲区发送的消息为:
如果不存在内存溢出,备缓冲区缓存第一缓冲区发送的消息;
则所述主缓冲区与备缓冲区进行主备切换为:
如果为正常状态,主缓冲区与备缓冲区进行主备切换。
优选的,所述方法还包括:
在从持久化存储区中读取消息之后,主缓冲区判断在备缓冲区中是否存在下一个读取的消息,如果存在,将所述备缓冲区的当前状态标记为正常状态,如果不存在,维持所述备缓冲区的当前状态。
优选的,所述持久化存储区位于所述服务器外部的分布式文件系统中。
优选的,所述主缓冲区和备缓冲区为同构的缓冲区。
优选的,所述消息生产者和消息消费者为运行在所述服务器上的两个进程或者为运行在所述服务器上的一个进程中的两个线程。
由上述实施例可以看出,与现有技术相比,本申请的优点在于:
在消息生产者和消息消费者所在的服务器的内存中设置用于缓存消息的缓冲区,在正常情况下,通过内存访问完成消息传输,保证了消息在消息队列系统中传输的实时性。并且,通过主、备缓冲区的双结构设计,可以实现在将消息生产者推送的消息存储在备缓冲区的同时,将消息从主缓冲区中传递给消息消费者,更进一步提高了消息在消息队列系统中传输的实时性。另外,还将消息生产者推送的消息存储在持久化存储区中,保证了消息的可靠性。
此外,当消息队列系统中的备缓冲区出现内存溢出问题时,即,在非正常情况下,也可以从持久化存储区中取回内存中丢失的消息,避免了由于消息队列系统中的内存发生内存溢出而导致溢出的消息无法正常地被传递给消息消费者的问题。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1示意性地示出了本发明的实施方式可以在其中实施的示例性应用场景;
图2示意性地示出了根据本申请实施例的一种消息队列系统的结构示意图;
图3示意性地示出了根据本申请实施例的另一种消息队列系统的结构示意图;
图4示意性地示出了根据本申请实施例的另一种消息队列系统的结构示意图;
图5示意地示出了根据本申请实施例的主缓冲区读取消息的工作示意图;
图6示意性地示出了根据本申请实施例的一种实现消息通信的方法的流程图;
图7示意性地示出了根据本申请实施例的另一种实现消息通信的方法的流程图;
图8示意性地示出了根据本申请实施例的另一种实现消息通信的方法的流程图。
具体实施方式
参阅图1所示,图1示意性地示出了本发明的实施方式可以在其中实施的示例性应用场景。其中,服务器上存在一个消息生产者10和一个消息消费者20,当消息生产者10与消息消费者20之间进行通信时,消息生产者10将消息21推送到消息队列系统30中,消息队列系统30负责将消息21传递给消息消费者20。另外,为了保证消息21的可靠性,消息队列系统30还需要将消息生产者10推送的消息21存储到持久化存储介质中,如,服务器上的本地磁盘。其中,“传递”可以表现为“推(push)”和“拉(pull)”两种模式,“推”模式是由消息队列系统30主动将消息21推送给消息消费者20,“拉”模式是消息消费者20主动通过轮询的方式从消息队列系统30中拉取消息21。消息生产者10和消息消费者20可以为服务器上的两个进程,也可以为服务器上同一个进程中的两个线程。本领域技术人员可以理解,图1所示的示意图仅是本发明的实施方式可以在其中得以实现的一个示例。本发明实施方式的应用范围不受到该框架任何方面的限制。例如,服务器上存在多个消息生产者和多个消息消费者,而不是如图1所示的仅存在一个消息生产者和一个消息消费者。
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图对本申请实施例进行详细描述。
装置实施例
本申请实施例还提供了一种消息队列系统。请参阅图2,图2示意性地示出了根据本申请实施例的一种消息队列系统的结构示意图。其中,该消息队列系统20包括:第一缓冲区21、第二缓冲区22以及持久化存储区23,第一缓冲区21和第二缓冲区22位于消息生产者和消息消费者所在的服务器的内存中,第二缓冲区22包括主缓冲区221和备缓冲区222。下面结合该装置的工作原理进一步介绍其内部结构以及连接关系。
第一缓冲区21,用于缓存消息生产者推送的消息,将消息生产者推送的消息存储在持久化存储区23中,并将已存储到持久化存储区23的消息发送给第二缓冲区22。
其中,在消息生产者生产的消息到达第一缓冲区21之后,会被首先持久化地存储到持久化存储区23中,以保证该消息的可靠性。如果存储失败,持久化存储区23告知第一缓冲区21消息存储失败,以便第一缓冲区21重新将消息持久化存储到持久化存储区23中直到存储成功为止,如果存储成功,持久化存储区23告知第一缓冲区21消息存储成功。
持久化存储区23,用于通过持久化存储介质对第一缓冲区21发送的消息进行持久化存储。
在本申请的一个可选实施方式中,持久化存储区23位于消息生产者和消息消费者所在的服务器内部的磁盘中,如图2所示,也可以位于该服务器外部的数据库中。
在本申请的另一个可选实施方式中,持久化存储区23位于该服务器外部的分布式文件系统中,如图3所示。将持久化存储区23布置在分布式文件系统中,可以很可靠地实现对海量消息的持久化存储的需求。另外,在分布式文件系统中,通过LogFile追加方式记录消息,也能够避免因为第一缓冲区21远程操作分布式文件系统而带来的延迟问题。
备缓冲区222,用于缓存第一缓冲区21发送的消息。
主缓冲区221,用于将位于主缓冲区221的消息传递给消息消费者,在将位于主缓冲区221的消息全部传递给消息消费者之后,与备缓冲区222进行主备切换。
也就是说,备缓冲区222专用于缓存第一缓冲区发送的消息,而主缓冲区221专用于将位于自身的消息传递给消息消费者。一旦主缓冲区221将自身的消息全部传递出去之后,就与备缓冲区互换身份,转换主备关系,即,原来的主缓冲区成为备缓冲区,开始缓存来自第一缓冲区21的消息,而原来的备缓冲区成为主缓冲区,将其缓存的消息传递给消息消费者。在以上的正常场景下,整个消息队列系统不需要读取在持久化存储区23中备份的消息,所有的逻辑在三个缓冲区(即,第一缓冲区21、主缓冲区221和备缓冲区222)中完成。
可以理解的,当在服务器的内存中设置用于缓存消息的缓冲区时,通过主、备缓冲区的双结构设计,可以实现在将消息生产者推送的消息存储在备缓冲区的同时,将消息从主缓冲区中传递给消息消费者,更好地保证了消息在消息队列系统中传输的实时性。
在本申请的一个可选实施方式中,主缓冲区221和备缓冲区222可以为同构的缓冲区,即,两个缓冲区的存储介质以及存储空间大小都相同。
考虑到消息消费者有时可能无法正常从消息队列系统中接收消息,或者只能以很慢的速度接收消息,并且消息生产者生产消息的速度又非常快,在这种情况下,主缓冲区221传递消息的进度与备缓冲区222缓存消息的进度会出现不匹配,前者快于后者,因此,在主缓冲区221将自身的消息全部传递出去之前,备缓冲区222就会因为第一缓冲区21转发过多的消息而发生内存溢出,当发生内存溢出时,备缓冲区222就会主动丢弃掉溢出的消息,而导致溢出的消息无法正常被传递给消息消费者。因此,为了解决由于备缓冲区222发生内存溢出而导致溢出的消息无法正常地被传递给消息消费者的问题,在本申请的另一个可选实施方式中,如图4所示,
备缓冲区222还用于,在缓存第一缓冲区21发送的消息之前,检查自身是否存在内存溢出,如果存在内存溢出,丢弃第一缓冲区21发送的消息,并将自身的当前状态标记为非正常状态,如果不存在内存溢出,继续缓存第一缓冲区21发送的消息。
主缓冲区221还用于,在与备缓冲区222进行主备切换之前,检查备缓冲区222的当前状态是否为正常状态,如果为非正常状态,不与备缓冲区222进行主备切换,而是从持久化存储区23中读取消息,并将读取的消息传递给消息消费者,如果为正常状态,继续与备缓冲区进行主备切换。
也就是说,当备缓冲区222发生内存溢出时,其被标记为非正常状态,表明当前的备缓冲区222所缓存的消息不完整,由于某些原因备缓冲区222已经丢弃了部分消息。因此,在这种非正常场景下,主缓冲区221不与备缓冲区222进行主备切换,而是直接访问持久化存储区23(如,底层的分布式文件系统),将持久化存储区23中保存的消息读取出来后继续传递给消息消费者。其中,主缓冲区221可以根据自己的存储空间大小从持久化存储区23中读取相应数量的消息,然后将读取的消息逐个地传递给消息消费者。
这种方式可以一直持续到主缓冲区221发现自己传递消息的进度可以与备缓冲区222缓存消息的进度匹配,此时主缓冲区221则不再需要从持久化存储区23中读取消息,而是回到正常场景下,通过主备切换方式传递消息。因此,在本申请的另一个可选实施方式中:
主缓冲区221还用于,在从持久化存储区23中读取消息之后,判断在备缓冲区222中是否存在下一个读取的消息,如果存在,说明主缓冲区221传递消息的进度可以与备缓冲区222缓存消息的进度匹配,主缓冲区221将备缓冲区222的当前状态标记为正常状态,如果不存在,维持备缓冲区222的当前状态。
例如,如图5所示,备缓冲区222缓存了标识为30-50的消息,而标识为1-29的消息由于内存溢出而被备缓冲区222丢弃掉了,主缓冲区221先从底层的分布式文件系统中读取消息,假设主缓冲区221一次性只能缓存20个消息,主缓冲区221从分布式文件系统中读取出标识为1-20的消息,并逐个地传递给消息消费者。在读取完之后,主缓冲区221判断其下一个读取的消息(即标识为21的消息)是否在备缓冲区222中,经过判断发现,其下一个读取的标识为21的消息不在备缓冲区222中,主缓冲区221继续维持备缓冲区222的当前状态标记,即,非正常状态。当主缓冲区221将自身的消息全部传递出去后,即刻检查备缓冲区222的当前状态,由于检查出的备缓冲区222的当前状态仍然为非正常状态,因此继续从底层的分布式文件系统中读取消息,即读取标识为21-40的消息,并逐个地传递给消息消费者。在读取完之后,主缓冲区221继续判断其下一个读取的消息(即标识为41的消息)是否在备缓冲区222中,经过判断发现,其下一个读取的标识为41的消息在备缓冲区222中,主缓冲区221将备缓冲区222的当前状态标记为正常状态。当主缓冲区221将自身的消息再一次全部传递出去后,由于检查出的备缓冲区222的当前状态为正常状态,因此可以正常地与备缓冲区222进行主备切换。
在本申请的一个可选实施方式中,消息生产者和消息消费者为运行在服务器上的两个进程或者为运行在服务器上的一个进程中的两个线程。
由上述实施例可以看出,与现有技术相比,本申请的优点在于:
在消息生产者和消息消费者所在的服务器的内存中设置用于缓存消息的缓冲区,在正常情况下,通过内存访问完成消息传输,保证了消息在消息队列系统中传输的实时性。并且,通过主、备缓冲区的双结构设计,可以实现在将消息生产者推送的消息存储在备缓冲区的同时,将消息从主缓冲区中传递给消息消费者,更进一步提高了消息在消息队列系统中传输的实时性。另外,还将消息生产者推送的消息存储在持久化存储区中,保证了消息的可靠性。
此外,当消息队列系统中的备缓冲区出现内存溢出问题时,即,在非正常情况下,也可以从持久化存储区中取回内存中丢失的消息,避免了由于消息队列系统中的内存发生内存溢出而导致溢出的消息无法正常地被传递给消息消费者的问题。
方法实施例
请参阅图6,图6示意性地示出了根据本申请实施例的一种实现消息通信的方法的流程图,例如,该方法可以由消息队列系统20执行,该方法例如可以包括以下步骤:
步骤600:预先在消息生产者和消息消费者所在的服务器的内存中建立第一缓冲区和第二缓冲区,所述第二缓冲区包括主缓冲区和备缓冲区。
步骤601:第一缓冲区缓存消息生产者推送的消息,将消息生产者推送的消息存储到持久化存储区中,以便将所述消息持久化地存储在所述持久化存储区中。
步骤602:第一缓冲区将已存储到所述持久化存储区的消息发送给第二缓冲区。
步骤603:备缓冲区缓存第一缓冲区发送的消息。
步骤604:主缓冲区将位于主缓冲区的消息传递给消息消费者。
步骤605:主缓冲区在将位于所述主缓冲区的消息全部传递给消息消费者之后,与备缓冲区进行主备切换。
如图7所示,在本申请的一个可选实施方式中,该方法例如可以包括以下步骤:
步骤600:预先在消息生产者和消息消费者所在的服务器的内存中建立第一缓冲区和第二缓冲区,所述第二缓冲区包括主缓冲区和备缓冲区。
步骤601:第一缓冲区缓存消息生产者推送的消息,将消息生产者推送的消息存储到持久化存储区中,以便将所述消息持久化地存储在所述持久化存储区中。
步骤602:第一缓冲区将已存储到所述持久化存储区的消息发送给第二缓冲区。
步骤603a:备缓冲区检查自身是否存在内存溢出,如果存在内存溢出,进入步骤606,如果不存在内存溢出,进入步骤603。
步骤603:备缓冲区缓存第一缓冲区发送的消息。
步骤604:主缓冲区将位于主缓冲区的消息传递给消息消费者。
步骤605a:在将位于所述主缓冲区的消息全部传递给消息消费者之后,主缓冲区检查备缓冲区的当前状态是否为正常状态,如果为非正常状态,进入步骤607,如果为正常状态,进入步骤605。
步骤605:主缓冲区与备缓冲区进行主备切换,结束流程。
步骤606:备缓冲区丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态,结束流程。
步骤607:主缓冲区不与备缓冲区进行主备切换,而从持久化存储区中读取消息,以便将读取的消息传递给消息消费者,结束流程。
如图8所示,在本申请的另一个可选实施方式中,该方法例如可以包括以下步骤:
步骤600:预先在消息生产者和消息消费者所在的服务器的内存中建立第一缓冲区和第二缓冲区,所述第二缓冲区包括主缓冲区和备缓冲区。
步骤601:第一缓冲区缓存消息生产者推送的消息,将消息生产者推送的消息存储到持久化存储区中,以便将所述消息持久化地存储在所述持久化存储区中。
步骤602:第一缓冲区将已存储到所述持久化存储区的消息发送给第二缓冲区。
步骤603a:备缓冲区检查自身是否存在内存溢出,如果存在内存溢出,进入步骤606,如果不存在内存溢出,进入步骤603。
步骤603:备缓冲区缓存第一缓冲区发送的消息。
步骤604:主缓冲区将位于主缓冲区的消息传递给消息消费者。
步骤605a:在将位于所述主缓冲区的消息全部传递给消息消费者之后,主缓冲区检查备缓冲区的当前状态是否为正常状态,如果为非正常状态,进入步骤607,如果为正常状态,进入步骤605。
步骤605:主缓冲区与备缓冲区进行主备切换,结束流程。
步骤606:备缓冲区丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态,结束流程。
步骤607:主缓冲区不与备缓冲区进行主备切换,而从持久化存储区中读取消息,以便将读取的消息传递给消息消费者。
步骤608:主缓冲区判断在备缓冲区中是否存在下一个读取的消息,如果存在,进入步骤609,如果不存在,进入步骤610。
步骤609:将所述备缓冲区的当前状态标记为正常状态,结束流程。
步骤610:维持所述备缓冲区的当前状态,结束流程。
在本申请的另一个可选实施方式中,所述持久化存储区位于所述服务器外部的分布式文件系统中。
在本申请的另一个可选实施方式中,所述主缓冲区和备缓冲区为同构的缓冲区。
在本申请的另一个可选实施方式中,所述消息生产者和消息消费者为运行在所述服务器上的两个进程或者为运行在所述服务器上的一个进程中的两个线程。
由上述实施例可以看出,与现有技术相比,本申请的优点在于:
在消息生产者和消息消费者所在的服务器的内存中设置用于缓存消息的缓冲区,在正常情况下,通过内存访问完成消息传输,保证了消息在消息队列系统中传输的实时性。并且,通过主、备缓冲区的双结构设计,可以实现在将消息生产者推送的消息存储在备缓冲区的同时,将消息从主缓冲区中传递给消息消费者,更进一步提高了消息在消息队列系统中传输的实时性。另外,还将消息生产者推送的消息存储在持久化存储区中,保证了消息的可靠性。
此外,当消息队列系统中的备缓冲区出现内存溢出问题时,即,在非正常情况下,也可以从持久化存储区中取回内存中丢失的消息,避免了由于消息队列系统中的内存发生内存溢出而导致溢出的消息无法正常地被传递给消息消费者的问题。
所述领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述到的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性、机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,可以采用软件功能单元的形式实现。
需要说明的是,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上对本申请所提供的消息队列系统以及实现消息通信的方法进行了详细介绍,本文中应用了具体实施例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (12)
1.一种消息队列系统,其特征在于,包括:第一缓冲区、第二缓冲区以及持久化存储区;其中,所述第一缓冲区和第二缓冲区位于消息生产者和消息消费者所在的服务器的内存中,所述第二缓冲区包括主缓冲区和备缓冲区;
所述第一缓冲区,用于缓存消息生产者推送的消息,将消息生产者推送的消息存储到所述持久化存储区中,并将已存储到所述持久化存储区的消息发送给所述第二缓冲区;
所述持久化存储区,用于通过持久化存储介质对所述第一缓冲区发送的消息进行持久化存储;
所述备缓冲区,用于缓存所述第一缓冲区发送的消息;
所述主缓冲区,用于将位于所述主缓冲区的消息传递给消息消费者,在将位于所述主缓冲区的消息全部传递给消息消费者之后,与所述备缓冲区进行主备切换。
2.根据权利要求1所述的系统,其特征在于,
所述备缓冲区还用于,在缓存所述第一缓冲区发送的消息之前,检查自身是否存在内存溢出,如果存在内存溢出,丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态,如果不存在内存溢出,继续缓存所述第一缓冲区发送的消息;
所述主缓冲区还用于,在与所述备缓冲区进行主备切换之前,检查所述备缓冲区的当前状态是否为正常状态,如果为非正常状态,不与所述备缓冲区进行主备切换,而从所述持久化存储区中读取消息,并将读取的消息传递给消息消费者,如果为正常状态,继续与所述备缓冲区进行主备切换。
3.根据权利要求2所述的系统,其特征在于,所述主缓冲区还用于,在从所述持久化存储区中读取消息之后,判断在所述备缓冲区中是否存在下一个读取的消息,如果存在,将所述备缓冲区的当前状态标记为正常状态,如果不存在,维持所述备缓冲区的当前状态。
4.根据权利要求1至3中任意一项所述的系统,其特征在于,所述持久化存储区位于所述服务器外部的分布式文件系统中。
5.根据权利要求1至4中任意一项所述的系统,其特征在于,所述主缓冲区和备缓冲区为同构的缓冲区。
6.根据权利要求1至4中任意一项所述的系统,其特征在于,所述消息生产者和消息消费者为运行在所述服务器上的两个进程或者为运行在所述服务器上的一个进程中的两个线程。
7.一种实现消息通信的方法,其特征在于,预先在消息生产者和消息消费者所在的服务器的内存中建立第一缓冲区和第二缓冲区,所述第二缓冲区包括主缓冲区和备缓冲区,所述方法包括:
第一缓冲区缓存消息生产者推送的消息,将消息生产者推送的消息存储到持久化存储区中,以便将所述消息持久化地存储在所述持久化存储区中;
第一缓冲区将已存储到所述持久化存储区的消息发送给第二缓冲区;
备缓冲区缓存第一缓冲区发送的消息;
主缓冲区将位于主缓冲区的消息传递给消息消费者,在将位于所述主缓冲区的消息全部传递给消息消费者之后,与备缓冲区进行主备切换。
8.根据权利要求7所述的方法,其特征在于,
所述方法还包括:
在缓存第一缓冲区发送的消息之前,备缓冲区检查自身是否存在内存溢出,如果存在内存溢出,丢弃所述第一缓冲区发送的消息,并将自身的当前状态标记为非正常状态;
在与备缓冲区进行主备切换之前,主缓冲区检查备缓冲区的当前状态是否为正常状态,如果为非正常状态,不与备缓冲区进行主备切换,而从持久化存储区中读取消息,以便将读取的消息传递给消息消费者;
则所述备缓冲区缓存第一缓冲区发送的消息为:
如果不存在内存溢出,备缓冲区缓存第一缓冲区发送的消息;
则所述主缓冲区与备缓冲区进行主备切换为:
如果为正常状态,主缓冲区与备缓冲区进行主备切换。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
在从持久化存储区中读取消息之后,主缓冲区判断在备缓冲区中是否存在下一个读取的消息,如果存在,将所述备缓冲区的当前状态标记为正常状态,如果不存在,维持所述备缓冲区的当前状态。
10.根据权利要求7至9中任意一项所述的方法,其特征在于,所述持久化存储区位于所述服务器外部的分布式文件系统中。
11.根据权利要求7至10中任意一项所述的方法,其特征在于,所述主缓冲区和备缓冲区为同构的缓冲区。
12.根据权利要求7至10中任意一项所述的方法,其特征在于,所述消息生产者和消息消费者为运行在所述服务器上的两个进程或者为运行在所述服务器上的一个进程中的两个线程。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510413284.1A CN107038075B (zh) | 2015-07-14 | 2015-07-14 | 消息队列系统以及实现消息通信的方法 |
PCT/CN2016/089308 WO2017008687A1 (zh) | 2015-07-14 | 2016-07-08 | 消息队列系统以及实现消息通信的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510413284.1A CN107038075B (zh) | 2015-07-14 | 2015-07-14 | 消息队列系统以及实现消息通信的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107038075A true CN107038075A (zh) | 2017-08-11 |
CN107038075B CN107038075B (zh) | 2020-12-25 |
Family
ID=57756860
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510413284.1A Active CN107038075B (zh) | 2015-07-14 | 2015-07-14 | 消息队列系统以及实现消息通信的方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN107038075B (zh) |
WO (1) | WO2017008687A1 (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052296A (zh) * | 2017-12-30 | 2018-05-18 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
CN110348826A (zh) * | 2018-04-08 | 2019-10-18 | 财付通支付科技有限公司 | 异地多活容灾方法、系统、设备及可读存储介质 |
CN111538600A (zh) * | 2020-02-25 | 2020-08-14 | 远景智能国际私人投资有限公司 | 消息处理方法、装置、计算机设备及存储介质 |
CN112162875A (zh) * | 2020-10-12 | 2021-01-01 | 上交所技术有限责任公司 | 一种交易系统内部高可靠消息传输方法 |
CN113296977A (zh) * | 2021-02-24 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
CN113296976A (zh) * | 2021-02-10 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 消息处理方法、装置、电子设备、存储介质及程序产品 |
CN115629878A (zh) * | 2022-10-20 | 2023-01-20 | 北京力控元通科技有限公司 | 一种基于内存交换的数据处理方法及系统 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109688200A (zh) * | 2018-11-30 | 2019-04-26 | 北京奇艺世纪科技有限公司 | 一种消息处理方法、装置及设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763289A (zh) * | 2009-09-25 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种基于共享内存的消息传递方法 |
CN102122256A (zh) * | 2011-03-28 | 2011-07-13 | 中国人民解放军国防科学技术大学 | 一种用于进程间通信的管道式通信方法及系统 |
CN103064731A (zh) * | 2012-12-26 | 2013-04-24 | 人民搜索网络股份公司 | 一种提高消息队列系统性能的装置及其方法 |
CN103154948A (zh) * | 2010-08-19 | 2013-06-12 | 桑迪士克以色列有限公司 | 可丢弃文件的基于卡的管理 |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN104077405A (zh) * | 2014-07-08 | 2014-10-01 | 国家电网公司 | 时序类型数据存取方法 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1330154C (zh) * | 2004-05-24 | 2007-08-01 | 中兴通讯股份有限公司 | 一种交换系统中接续消息的处理方法 |
US7277990B2 (en) * | 2004-09-30 | 2007-10-02 | Sanjeev Jain | Method and apparatus providing efficient queue descriptor memory access |
CN101853238A (zh) * | 2010-06-01 | 2010-10-06 | 华为技术有限公司 | 通信处理器间消息通信方法和系统 |
CN103078921B (zh) * | 2012-12-28 | 2016-08-17 | Tcl集团股份有限公司 | 一种发送、接收消息的方法及装置 |
CN103064749B (zh) * | 2013-01-09 | 2017-05-24 | 上海斐讯数据通信技术有限公司 | 一种进程间通信方法 |
CN103390049A (zh) * | 2013-07-23 | 2013-11-13 | 南京联创科技集团股份有限公司 | 一种基于内存数据库缓存的高速消息队列溢出的处理方法 |
-
2015
- 2015-07-14 CN CN201510413284.1A patent/CN107038075B/zh active Active
-
2016
- 2016-07-08 WO PCT/CN2016/089308 patent/WO2017008687A1/zh active Application Filing
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763289A (zh) * | 2009-09-25 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种基于共享内存的消息传递方法 |
CN103154948A (zh) * | 2010-08-19 | 2013-06-12 | 桑迪士克以色列有限公司 | 可丢弃文件的基于卡的管理 |
CN102122256A (zh) * | 2011-03-28 | 2011-07-13 | 中国人民解放军国防科学技术大学 | 一种用于进程间通信的管道式通信方法及系统 |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN103064731A (zh) * | 2012-12-26 | 2013-04-24 | 人民搜索网络股份公司 | 一种提高消息队列系统性能的装置及其方法 |
CN104077405A (zh) * | 2014-07-08 | 2014-10-01 | 国家电网公司 | 时序类型数据存取方法 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052296A (zh) * | 2017-12-30 | 2018-05-18 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
CN108052296B (zh) * | 2017-12-30 | 2021-02-19 | 惠龙易通国际物流股份有限公司 | 一种数据读取方法、设备及计算机存储介质 |
CN110348826A (zh) * | 2018-04-08 | 2019-10-18 | 财付通支付科技有限公司 | 异地多活容灾方法、系统、设备及可读存储介质 |
CN110348826B (zh) * | 2018-04-08 | 2024-05-10 | 财付通支付科技有限公司 | 异地多活容灾方法、系统、设备及可读存储介质 |
CN111538600A (zh) * | 2020-02-25 | 2020-08-14 | 远景智能国际私人投资有限公司 | 消息处理方法、装置、计算机设备及存储介质 |
CN111538600B (zh) * | 2020-02-25 | 2023-09-12 | 远景智能国际私人投资有限公司 | 消息处理方法、装置、计算机设备及存储介质 |
CN112162875A (zh) * | 2020-10-12 | 2021-01-01 | 上交所技术有限责任公司 | 一种交易系统内部高可靠消息传输方法 |
CN113296976A (zh) * | 2021-02-10 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 消息处理方法、装置、电子设备、存储介质及程序产品 |
CN113296977A (zh) * | 2021-02-24 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
CN113296977B (zh) * | 2021-02-24 | 2023-04-07 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
CN115629878A (zh) * | 2022-10-20 | 2023-01-20 | 北京力控元通科技有限公司 | 一种基于内存交换的数据处理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
WO2017008687A1 (zh) | 2017-01-19 |
CN107038075B (zh) | 2020-12-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107038075A (zh) | 消息队列系统以及实现消息通信的方法 | |
US8467383B2 (en) | Stateful switching between reliable transport modules for communicating with an external peer without losing the transport layer connection | |
US9647972B2 (en) | Message delivery in messaging networks | |
US8867375B2 (en) | Failback to a primary communications adapter | |
US6594776B1 (en) | Mechanism to clear MAC address from Ethernet switch address table to enable network link fail-over across two network segments | |
US7996849B2 (en) | Method, apparatus and software for managing a transactional message queue | |
US9838245B2 (en) | Systems and methods for improved fault tolerance in solicited information handling systems | |
CN101903864B (zh) | 节点系统、服务器切换方法、服务器装置和数据接管方法 | |
CN112583931A (zh) | 消息处理方法、消息中间件、电子设备和存储介质 | |
CN108616914A (zh) | 一种断线重连的方法及装置 | |
CN109756552B (zh) | 一种乘客信息系统消息分发方法和装置及乘客信息系统 | |
CN103209214A (zh) | 一种基于NoSQL的消息中间件的实现方法 | |
CN114371912A (zh) | 数据中心的虚拟网络管理方法及数据中心系统 | |
CN107329859A (zh) | 一种数据保护方法及存储设备 | |
CN103947177A (zh) | 中间主机备份复制中的方法和设备 | |
CN102103613A (zh) | 分布式数据库升级的方法、升级处理装置及升级控制装置 | |
CN102184183A (zh) | 一种分布式数据库数据同步方法 | |
US20120320909A1 (en) | Sending request messages over designated communications channels | |
CN107733695A (zh) | 一种issu过程中的vxlan隧道优化方法及装置 | |
CN110213176A (zh) | 交换机的报文处理方法、装置、设备及介质 | |
CN109474525A (zh) | 报文的处理方法、装置、设备及可读存储介质 | |
CN109787835A (zh) | 一种会话备份方法及装置 | |
JP2009217765A (ja) | 複数宛先への同期送信方法、その実施システム及び処理プログラム | |
CN109039732B (zh) | 消息处理系统及消息处理方法 | |
CN105389127A (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 |