CN111984198B - 消息队列实现方法、装置及电子设备 - Google Patents
消息队列实现方法、装置及电子设备 Download PDFInfo
- Publication number
- CN111984198B CN111984198B CN202010864840.8A CN202010864840A CN111984198B CN 111984198 B CN111984198 B CN 111984198B CN 202010864840 A CN202010864840 A CN 202010864840A CN 111984198 B CN111984198 B CN 111984198B
- Authority
- CN
- China
- Prior art keywords
- message
- queue
- sub
- data block
- writing
- 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 53
- 230000015654 memory Effects 0.000 claims description 46
- 230000004044 response Effects 0.000 claims description 16
- 238000013507 mapping Methods 0.000 claims description 12
- 230000007246 mechanism Effects 0.000 claims description 10
- 230000008569 process Effects 0.000 abstract description 23
- 238000012423 maintenance Methods 0.000 abstract description 7
- 238000004519 manufacturing process Methods 0.000 description 11
- 238000012545 processing Methods 0.000 description 7
- 230000001360 synchronised effect Effects 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 238000010586 diagram Methods 0.000 description 3
- 238000013500 data storage Methods 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 101100100125 Mus musculus Traip gene Proteins 0.000 description 1
- BQCADISMDOOEFD-UHFFFAOYSA-N Silver Chemical compound [Ag] BQCADISMDOOEFD-UHFFFAOYSA-N 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 239000008358 core component Substances 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 229910052709 silver Inorganic materials 0.000 description 1
- 239000004332 silver Substances 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
-
- 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/548—Queue
Abstract
本发明提供了一种消息队列实现方法、装置及电子设备,通过将消息队列配置为基于硬盘的本地队列,可以使得该消息队列挂载在应用进程中,避免使用重量级消息队列需要单独搭建集群的问题,且无需繁琐的维护工作,实现了消息队列的轻量级架构,同时,在消息写入到该消息队列时,由于该消息队列是由若干个子队列组成,每个子队列由至少两个数据块组成,接收到消息写入当前子队列的当前数据块达到一定长度时,自动切换至下一子队列对应的数据块,可以避免消息同步的同时需要等待数据处理的时间过长的问题,保证了消息写入的高效性。
Description
技术领域
本发明涉及计算机技术领域,更具体的说,涉及一种消息队列实现方式、装置及电子设备。
背景技术
硬盘是计算机实现数据永久存储的核心组件,应用程序本身和应用程序依赖的数据都存储在硬盘上,当系统启动后,会把数据从硬盘中读取到内存中。消息队列是分布式应用交换信息的一种技术,内存可以通过消息队列将硬盘的数据进行读取。目前在生产环境,使用较多的消息队列有ActiveMQ、RabbitMQ、Kafka、MetaMQ、RocketMQ等,实现了消息数据包的点对点传输、发送/订阅等数据分发功能。但是,目前的消息队列作为资源的启动过程都很复杂,并且耗时很长,降低了数据写入效率,使得采用该种消息队列的部署维护工作较为繁琐,并且这些队列的部署需要使用较多的物理资源,间接的造成资源的浪费。
发明内容
有鉴于此,本发明提供一种消息队列实现方法、装置及电子设备,保证消息队列轻量级架构无需单独部署和繁琐维护,并保证了数据写入的高效性。
为解决上述技术问题,本发明采用了如下技术方案:
一种消息队列实现方法,包括:
配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
可选地,所述方法还包括:
响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
可选地,所述消息队列的子队列包括生产元信息和消费元信息,所述生产元信息和所述消费元信息均包括块内偏移、数据块索引和位置总偏移。
可选地,所述响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,包括:
响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
可选地,所述方法还包括:
对所述消息队列中的消息进行读取,包括:
获取所述消息队列当前工作的子队列;
若当前工作的子队列中的当前数据块的消息已被完整读取,获取到当前数据块对应的目标数据块,对所述下目标数据块的消息进行读取,所述目标数据块为当前工作的子队列对应的下一子队列中的与所述当前数据块在所述当前工作的子队列中位置相同的数据块;
若所述当前数据块还存在未被读取的消息,对所述当前数据块进行消息读取;
依据读取到的消息,更新消费者元信息。
可选地,所述方法还包括:
建立多个硬盘与内存的映射表,并确定硬盘的消息写入的上限阈值;
响应于消息向内存写入时,通过所述映射表轮询与所述内存映射的多个硬盘,使得当消息写入量达到当前硬盘上限阈值时,向下一硬盘写入消息。
一种消息队列实现装置,包括:
配置单元,用于所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
写入单元,用于响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
可选地,所述装置还包括:
同步单元,用于响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
一种存储介质,所述存储介质包括存储的程序,其中,所述程序执行如上任意一项所述的消息队列实现方法。
一种电子设备,包括:存储器和处理器;
其中,所述存储器用于存储程序;
处理器调用程序并用于:
配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
相较于现有技术,本发明具有以下有益效果:
本发明提供了一种消息队列实现方法、装置及电子设备,通过将消息队列配置为基于硬盘的本地队列,可以使得该消息队列挂载在应用进程中,避免使用重量级消息队列需要单独搭建集群的问题,且无需繁琐的维护工作,实现了消息队列的轻量级架构,同时,在消息写入到该消息队列时,由于该消息队列是由若干个子队列组成,每个子队列由至少两个数据块组成,接收到消息写入当前子队列的当前数据块达到一定长度时,自动切换至下一子队列对应的数据块,可以避免消息同步的时需要等待数据处理的时间过长的问题,保证了消息写入的高效性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的一种消息队列实现方法的方法流程图;
图2为本发明实施例提供的一种数据写入和读取的示意图;
图3为本发明实施例提供的一种生产者的数据处理方法的流程示意图;
图4为本发明实施例提供的一种消费者的数据处理流程图;
图5为本发明实施例提供的一种消息队列实现装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例提供了一种消息队列实现方法,参见图1,所述方法可以包括以下步骤:
S101、配置消息队列。
消息队列是分布式应用间交换信息的技术,其可以设置在内存上也可以设置在磁盘上。在本发明实施例中的消息队列是基于硬盘的本地队列,因为需要消息的持久化,必须使用文件作为数据的存储介质,而文件的读写速度很慢,因此使用内存映射技术加快数据的读写,即先申请足够大的文件之后把文件映射到内存,写数据是把数据直接写在内存里,等数据积累到一定量时才把数据一次性写入到硬盘上,因为硬盘的顺序读写的速度是比较高的。但是在此过程中新来的数据是无法快读写入到当前的内存,因为当前文件正在进行文件同步操作。
本发明实施例的消息队列是基于硬盘的本地队列,因此,该消息队列无需依赖其他集群,适用于本地进程内部的消息队列,实现了消息队列的轻量级。并且该消息队列由N个子队列组成,而每个队列又包括M数据块,其中N为大于1的整数,M为大于等于2的整数,每个数据块为指定长度。每个子队列可以是文件的形式体现。需要消息的持久化,必须使用文件作为数据的存储介质,而文件的读写速度很慢,通常会采用内存映射技术加快数据的读写,即先申请足够大的文件后把文件映射到内存,写数据是把数据直接写在内存里,当数据积累到一定量时才能把数据一次性的顺序写入到硬盘上,因为硬盘的顺序读取的速度是比较高的。但是,在此过程中新来的数据是没办法快速写入当前文件的内存,因为当前文件正在进行文件同步操作。因此,在本发明实施例中使用多个子队列(每个子队列可以理解为是一个文件)。当新来的消息写入到该消息队列时,先写入到子队列的数据块中,由于数据块限定了长度,待写满当前数据块后会写入下一子队列对应的数据块中,保证了写入完成的数据块在进行数据同步时,不影响下一数据块的写入。具体的数据写入格式请参见步骤S102的描述。
S102、响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列。
其中,写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
在本发明实施例中,子队列的各个数据块的容量大小相等,且所述数据块的容量根据硬盘的读写速度进行确定。这样可以设置消息同步的阈值,该阈值大小与数据块容量大小一致,使得当写满一个数据块的时候可以自动触发数据同步机制,使得写入的消息自动同步至指定位置,如将写入内存的消息自动同步至磁盘中。从而保证消息写入后的自动同步,并且不影响后续消息的自动写入。例如,在本发明实施例中每个子队列可以是一个文件,这样一个消息队列由多个文件组成,每个文件作为队列的一个子队列。每个子队列按照指定的大小划分为数据块。例如,消息队列由n个子队列组成,每个子队列有两个数据块组成,数据写入顺序是子队列1的数据块1,然后写入子队列2的数据块1,依次直到写入子队列n的数据块1,然后再写入到子队列1的数据块2,子队列2的数据块2…循环往返。
具体的,如消息队列包括第一子队列、第二子队列和第三子队列,且所述第一子队列、第二子队列和第三子队列分别包括第一数据块和第二数据块;
所述写入格式为按照第一子队列的第一数据块、第二子队列的第一数据块、第三子队列的第一数据块、第一子队列的第二数据块、第二子队列的第二数据块、第三子队列的第二数据块、第一子队列的第一数据块的循环往返顺序进行写入。
这样即使在处理大量消息时,也可以将消息分为大小相同的待写入消息,然后将待写入消息按顺序写入到消息队列的对应子队列的数据块中,并且是采用上述循环往返的写入方式进行写入。当同步至硬盘或者等待硬盘存储或处理数据时,可以先处理已经写满的数据块,然后新消息继续写入其他队列的数据块,这样即使在数据块的数据被同步或者处理时,也有其他子队列的数据块可以进行消息写入,无需再等消息处理完再继续写入,提高了写入的时效性。同时按照该方式进行数据存储或者同步时,可以后续存储时刷新前面存储的数据,前面的数据经过一段时间后可能已经不需要存储,也可以提高存储空间效率。
上述过程描述了消息写入的过程,对应的消息读取的过程是与该消息写入的过程是相对应的,即响应于对所述消息队列中的消息进行读取,依据与所述写入格式对应的读取格式,对所述消息队列的进行读取,得到读取数据。
在本发明实施例中还包括:响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。在该实施例中触发数据同步机制的条件是当前子队列的数据块已经写满,即将内存同步至硬盘的银盘存储阈值设置与数据块容量大小一致,通过操作系统的内存映射机制,自动将写满的数据块的消息同步至内存,无需等待将数据全部写入再同步至硬盘,提升了数据同步的效率。
在本发明实施例中,子队列包括生产者元信息和消费者元信息,所述生产元信息和所述消费元信息均包括块内偏移、数据块索引和位置总偏移。具体的,所述生产者元信息包括下次生产位置总偏移、所在数据块内的偏移,所在数据块的索引;所述消费者元信息,包括下次生产位置总偏移、所在数据块内的偏移,所在数据块的索引;所述消息队列包括消费者队列索引和生产者队列索引。
其中,向主题发布消息的客户端应用程序称为生产者,生产者用于持续不断的向某个主题发送消息;订阅主题消息的客户端程序称为消费者,消费者用于处理生产者产生的消息。偏移量是把存储单元的实际地址与其所在段地址之间的距离称之为段内偏移,也称为“有效地址或偏移量”。索引提供指向存储在消息队列的指定列中的数据值的指针。因此,可以通过生产者元信息和消费者元信息确定消息写入的位置或者消息要进行读取的位置。具体的,根据生产者元信息中的下次生产位置总偏移以及消息的大小,计算出待写入消息对应的数据块以及数据块中的位置。所述下次生产位置总偏移为待写入起始点在所述当前数据块中的偏移量,数据块内偏移为在所述数据块中待写入的偏移量。根据待写入子队列的起始地址以及待存储子队列的起始地址偏移量确定消息的写入地址。同理,可以根据消费者下次消费位置总偏移以及数据块内偏移确定消息待读取的地址。对应的,可以根据生产者元信息和消费者元信息中的数据块索引是索引与数据块内容一一对应,即可以根据数据块索引信息获得对应的数据库中的消息内容。消费队列索引和生成队列索引是指生成的索引与消费队列或者生产队列中的内容进行一一对应的。使得通过本申请实施例中的生产者元信息和消费者元信息能够确定写入消息对应的队列、数据块以及待写入的数据块的具体位置,以及待读取的消息在数据块中的具体位置。
参见图2,其示出了本发明实施例提供的一种数据写入和读取的示意图,图2中箭头所指明的方向就是数据写入或读取遵循的规则,数据写入是先往子队列1的块1写入,之后在刷新子队列1的数据到内存的同时,新来的数据往子队列2的块1写入,以此类推,当数据写满最后一个子队列的最后一个块后,会重新从子队列1的块1开始写入数据。子队列的元信息主要为了记录消费者和生产者下一次读写的具体位置。这些元信息的写入一定要是原子性的,即要么都失败,要么都成功。而队列的元信息则标注了当前队列工作在哪个子队列上,当服务意外退出后操作系统会把内存的数据同步到硬盘上,所以服务重启后数据也并不会丢失。
在本发明实施例中消息写入的过程为:响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。对应的,对消息队列中的消息进行读取的过程包括:获取所述消息队列当前工作的子队列;若当前工作的子队列中的当前数据块的消息已被完整读取,获取到当前数据块对应的目标数据块,对所述下目标数据块的消息进行读取,所述目标数据块为当前工作的子队列对应的下一子队列中的与所述当前数据块在所述当前工作的子队列中位置相同的数据块;若所述当前数据块还存在未被读取的消息,对所述当前数据块进行消息读取;依据读取到的消息,更新消费者元信息。具体处理过程请参见图3和图4对应的实施例的描述,此处不进行一一赘述。
参见图3,其示出了本发明实施例提供的一种生产者的数据处理方法的流程示意图,该方法包括:
S201、接收消息。
S202、判断所述消息是否合法,如果是,执行S203,如果否,执行S208。
S203、获取当前工作的子队列;
S204、获取生产者元信息;
S205、判断当前数据块是否已满,如果否,执行S206,如果是,执行208。
S206、写入消息到当前数据块。
S207、更新生产者元信息。
S208、移动到下一数据块。
S209、刷新数据到硬盘。
需要说明的是,判断消息的合法性是指消息是否为具有权限的消息生生产者产生的,消息格式是否满足预设的待处理的消息格式,消息内容是否与待存储的消息主题相关等,具体的可以根据消息队列应用进程以及应用场景进行确定。
对应的,参见图4,其示出了本发明实施例提供的一种消费者的数据处理流程图,其包括以下步骤:
S301、响应于对所述消息队列中的消息进行读取,获取所述消息队列当前工作的子队列。
S302、判断当前工作的子队列的当前数据块的消息是否已被完整读取,如果否,执行S303,如果是,执行S306。
S303、判断当前数据块是否存在未读取的消息,如果是,执行S304。
S304、对当前数据块进行消息读取。
S305、更新消费者元信息。
S306、移动到下一数据块。
需要说明的是,无论是在消息生产处理流程还是消息消费处理流程中,在当前数据块写入已满,或者当前数据块已完整读取后,进入下一数据块的处理时,该下一数据块是指当前子队列对应的下一队列中,与当前数据块在当前子队列中位置相同的数据块,如当前数据块为第一子队列的第一数据块,则下一数据块为第二子队列的第二数据块。
在消息写入完成或者消息读取完成后,需要更新对应的生产者元信息或者消费者元信息,这样可以更新当前处理的数据块的偏移量信息,使得在下次进行写入或者读取时能够快速定位到对应的消息写入或读取的起始地址。可以适用于故障重启后的消息写入或读取。
应用本发明实施例的消息队列进行数据读取和写入时,由于该消息队列是轻量级队列,适用于本地进程内部的消息队列,数据吞吐量能达到硬盘的顺序写入速度,并且该消息队列很适合部署在云端,可挂载到任意主机上。该消息队列无需单独部署,直接和服务启动在一个相同的机器上,不需要繁琐的维护工作。
本发明提供了一种消息队列实现方法通过将消息队列配置为基于硬盘的本地队列,可以使得该消息队列挂载在应用进程中,避免使用重量级消息队列需要单独搭建集群的问题,且无需繁琐的维护工作,实现了消息队列的轻量级架构,同时,在消息写入到该消息队列时,由于该消息队列是由若干个子队列组成,每个子队列由至少两个数据块组成,接收到消息写入当前子队列的当前数据块达到一定长度时,自动切换至下一子队列对应的数据块,可以避免消息同步的同时需要等待数据处理的时间过长的问题,保证了消息写入的高效性。
在本发明实施例中将消息队列中的消息由内存同步至硬盘的过程还可以通过将多个硬盘与内存建立映射表,硬盘中设置消息写入的上限阈值,消息向内存写入时轮询与其映射的多个硬盘,即当消息写入量达到硬盘上限阈值时,向下一硬盘写入消息,以此方式将消息轮回写入N个硬盘中,解脱消息写入物理硬盘时物理特性限制,解决消息处理卡段的现象。
对应的,在本发明实施例中还提供了一种消息队列实现装置,参见图4,包括:
配置单元10,用于配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
写入单元20,响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
在上述实施例的基础上,所述装置还包括:
同步单元,用于响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
在上述实施例的基础上,所述消息队列的子队列包括生产元信息和消费元信息,所述生产元信息和所述消费元信息均包括块内偏移、数据块索引和位置总偏移。
在上述实施例的基础上,所述写入单元包括:
第一判断子单元,用于响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
第二判断子单元,用于根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
写入子单元,用于如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
第一更新子单元,用于响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
在上述实施例的基础上,所述装置还包括:
读取单元,用于对所述消息队列中的消息进行读取,所述读取单元包括:
第一获取子单元,用于获取所述消息队列当前工作的子队列;
第二获取子单元,用于若当前工作的子队列中的当前数据块的消息已被完整读取,获取到当前数据块对应的目标数据块,对所述下目标数据块的消息进行读取,所述目标数据块为当前工作的子队列对应的下一子队列中的与所述当前数据块在所述当前工作的子队列中位置相同的数据块;
读取子单元,用于若所述当前数据块还存在未被读取的消息,对所述当前数据块进行消息读取;
第二更新子单元,用于依据读取到的消息,更新消费者元信息。
在上述实施例的基础上,其特征在于,所述装置还包括:
建立单元,用于建立多个硬盘与内存的映射表,并确定硬盘的消息写入的上限阈值;
轮询单元,用于响应于消息向内存写入时,通过所述映射表轮询与所述内存映射的多个硬盘,使得当消息写入量达到当前硬盘上限阈值时,向下一硬盘写入消息。
需要说明的是,本实施例中的各个模块、子模块和单元的工作过程请参照上述实施例中的相应说明,在此不再赘述。
本发明实施例提供了一种存储介质,其上存储有程序,该程序被处理器执行时实现所述消息队列实现方法。
本发明实施例提供了一种电子设备,包括:存储器和处理器;
其中,所述存储器用于存储程序;
处理器调用程序并用于:
配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数。
通过本发明实施例可以通过将消息队列配置为基于硬盘的本地队列,可以使得该消息队列挂载在应用进程中,避免使用重量级消息队列需要单独搭建集群的问题,且无需繁琐的维护工作,实现了消息队列的轻量级架构,同时,在消息写入到该消息队列时,由于该消息队列是由若干个子队列组成,每个子队列由至少两个数据块组成,接收到消息写入当前子队列的当前数据块达到一定长度时,自动切换至下一子队列对应的数据块,可以避免消息同步的同时需要等待数据处理的时间过长的问题,保证了消息写入的高效性。
可选地,所述方法还包括:
响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
可选地,所述消息队列的子队列包括生产元信息和消费元信息,所述生产元信息和所述消费元信息均包括块内偏移、数据块索引和位置总偏移。
可选地,所述响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,包括:
响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
可选地,所述方法还包括:
对所述消息队列中的消息进行读取,包括:
获取所述消息队列当前工作的子队列;
若当前工作的子队列中的当前数据块的消息已被完整读取,获取到当前数据块对应的目标数据块,对所述下目标数据块的消息进行读取,所述目标数据块为当前工作的子队列对应的下一子队列中的与所述当前数据块在所述当前工作的子队列中位置相同的数据块;
若所述当前数据块还存在未被读取的消息,对所述当前数据块进行消息读取;
依据读取到的消息,更新消费者元信息。
可选地,所述方法还包括:
建立多个硬盘与内存的映射表,并确定硬盘的消息写入的上限阈值;
响应于消息向内存写入时,通过所述映射表轮询与所述内存映射的多个硬盘,使得当消息写入量达到当前硬盘上限阈值时,向下一硬盘写入消息。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (8)
1.一种消息队列实现方法,其特征在于,包括:
配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数;
其中,所述消息队列的子队列包括生产者元信息和消费者元信息,所述生产者元信息和所述消费者元信息均包括块内偏移、数据块索引和位置总偏移;所述响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,包括:
响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
对所述消息队列中的消息进行读取,包括:
获取所述消息队列当前工作的子队列;
若当前工作的子队列中的当前数据块的消息已被完整读取,获取到当前数据块对应的目标数据块,对所述目标数据块的消息进行读取,所述目标数据块为当前工作的子队列对应的下一子队列中的与所述当前数据块在所述当前工作的子队列中位置相同的数据块;
若所述当前数据块还存在未被读取的消息,对所述当前数据块进行消息读取;
依据读取到的消息,更新消费者元信息。
4.根据权利要求2所述的方法,其特征在于,所述方法还包括:
建立多个硬盘与内存的映射表,并确定硬盘的消息写入的上限阈值;
响应于消息向内存写入时,通过所述映射表轮询与所述内存映射的多个硬盘,使得当消息写入量达到当前硬盘上限阈值时,向下一硬盘写入消息。
5.一种消息队列实现装置,其特征在于,包括:
配置单元,用于所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
写入单元,用于响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数;
其中,所述消息队列的子队列包括生产者元信息和消费者元信息,所述生产者元信息和所述消费者元信息均包括块内偏移、数据块索引和位置总偏移;
所述写入单元响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,包括:
响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
6.根据权利要求5所述的装置,其特征在于,所述装置还包括:
同步单元,用于响应于所述消息队列应用于将内存消息写入到硬盘时,在消息写满第i个子队列的第j个数据块,触发数据同步机制,将所述第i个子队列的第j个数据块的消息同步至硬盘。
7.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,所述程序执行权利要求1至4中任意一项所述的消息队列实现方法。
8.一种电子设备,其特征在于,包括:存储器和处理器;
其中,所述存储器用于存储程序;
处理器调用程序并用于:
配置消息队列,所述消息队列为基于硬盘的本地队列,所述消息队列包括N个子队列,且所述子队列包括M个数据块,其中N为大于1的整数,M为大于等于2的整数;
响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,所述写入格式为将消息写入第i个子队列的第j个数据块,待所述第i个子队列的第j个数据块写满消息后,将消息写入第i+1个子队列的第j个数据块,直至第N个子队列的第j个数据块写满消息后,将消息写入第i个子队列的第j+1个数据块的循环往返的写入格式,其中,i为大于等于1小于等于N的整数,j为大于等于1小于等于M的整数;
其中,所述消息队列的子队列包括生产者元信息和消费者元信息,所述生产者元信息和所述消费者元信息均包括块内偏移、数据块索引和位置总偏移;所述响应于接收到消息,依据与所述消息队列相匹配的写入格式,将所述接收到的消息写入到所述消息队列,包括:
响应于接收到消息,判断所述消息是否合法,如果是,获取所述消息队列的当前工作的子队列和所述生产者元信息,其中,所述当前工作的子队列为所述消息队列的第一子队列,第一子队列当前数据块为第一数据块;
根据所述生产者元信息,判断所述第一子队列的第一数据块是否已经写满,如果否,将所述接收到的消息写入到所述第一数据块;
如果是,确定目标数据块,将所述接收到的消息写入到所述目标数据块,所述目标数据块为所述第一子队列对应的第二子队列的第一数据块;
响应于将所述接收到的消息写入到所述消息队列,更新所述生产者元信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010864840.8A CN111984198B (zh) | 2020-08-25 | 2020-08-25 | 消息队列实现方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010864840.8A CN111984198B (zh) | 2020-08-25 | 2020-08-25 | 消息队列实现方法、装置及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111984198A CN111984198A (zh) | 2020-11-24 |
CN111984198B true CN111984198B (zh) | 2024-02-27 |
Family
ID=73444118
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010864840.8A Active CN111984198B (zh) | 2020-08-25 | 2020-08-25 | 消息队列实现方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111984198B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112667592A (zh) * | 2020-12-24 | 2021-04-16 | 平安科技(深圳)有限公司 | 数据存储方法、装置、计算机设备和存储介质 |
CN113360487A (zh) * | 2021-06-03 | 2021-09-07 | 上海微盟企业发展有限公司 | 一种消息去重方法及相关装置 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1998021654A1 (en) * | 1996-11-14 | 1998-05-22 | Mitsubishi Electric Information Technology Center America, Inc. | Log based data architecture for a transactional message queuing system |
CN101968876A (zh) * | 2010-09-17 | 2011-02-09 | 航天恒星科技有限公司 | 一种地面系统遥感图像的自适应实时处理方法 |
US8261286B1 (en) * | 2008-06-18 | 2012-09-04 | Amazon Technologies, Inc. | Fast sequential message store |
CN105068769A (zh) * | 2015-08-28 | 2015-11-18 | 浪潮软件股份有限公司 | 一种基于消息中间件的消息管理方法及装置 |
CN106843748A (zh) * | 2016-11-28 | 2017-06-13 | 北京握奇智能科技有限公司 | 一种提高数据写入移动存储设备速度的方法和系统 |
CN108347476A (zh) * | 2018-01-22 | 2018-07-31 | 广东欧珀移动通信有限公司 | 跨机房数据同步方法、装置以及服务器 |
CN110737536A (zh) * | 2019-09-19 | 2020-01-31 | 亚信创新技术(南京)有限公司 | 一种基于共享内存的消息存储方法和消息读取方法 |
CN111241088A (zh) * | 2018-11-09 | 2020-06-05 | 北京京东尚科信息技术有限公司 | 数据写入方法、数据查询方法、装置及设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3565230B1 (en) * | 2018-05-04 | 2023-12-06 | Mitel Networks Corporation | System and method for queue load balancing |
-
2020
- 2020-08-25 CN CN202010864840.8A patent/CN111984198B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1998021654A1 (en) * | 1996-11-14 | 1998-05-22 | Mitsubishi Electric Information Technology Center America, Inc. | Log based data architecture for a transactional message queuing system |
US8261286B1 (en) * | 2008-06-18 | 2012-09-04 | Amazon Technologies, Inc. | Fast sequential message store |
CN101968876A (zh) * | 2010-09-17 | 2011-02-09 | 航天恒星科技有限公司 | 一种地面系统遥感图像的自适应实时处理方法 |
CN105068769A (zh) * | 2015-08-28 | 2015-11-18 | 浪潮软件股份有限公司 | 一种基于消息中间件的消息管理方法及装置 |
CN106843748A (zh) * | 2016-11-28 | 2017-06-13 | 北京握奇智能科技有限公司 | 一种提高数据写入移动存储设备速度的方法和系统 |
CN108347476A (zh) * | 2018-01-22 | 2018-07-31 | 广东欧珀移动通信有限公司 | 跨机房数据同步方法、装置以及服务器 |
CN111241088A (zh) * | 2018-11-09 | 2020-06-05 | 北京京东尚科信息技术有限公司 | 数据写入方法、数据查询方法、装置及设备 |
CN110737536A (zh) * | 2019-09-19 | 2020-01-31 | 亚信创新技术(南京)有限公司 | 一种基于共享内存的消息存储方法和消息读取方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111984198A (zh) | 2020-11-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110113420B (zh) | 基于nvm的分布式消息队列管理系统 | |
CN102467408B (zh) | 一种虚拟机数据的访问方法和设备 | |
CN101208671B (zh) | 管理消息队列 | |
CN111984198B (zh) | 消息队列实现方法、装置及电子设备 | |
CN110737536B (zh) | 一种基于共享内存的消息存储方法和消息读取方法 | |
CN103218176B (zh) | 数据处理方法及装置 | |
CN103516549B (zh) | 一种基于共享对象存储的文件系统元数据日志机制 | |
CN110609730A (zh) | 一种实现虚拟处理器间中断透传的方法及设备 | |
CN109582686B (zh) | 分布式元数据管理一致性保证方法、装置、系统及应用 | |
CN106681660B (zh) | Io调度方法及io调度装置 | |
CN103049224A (zh) | 将数据导入物理磁带的方法、装置和系统 | |
CN110750372A (zh) | 基于共享内存的日志系统及日志管理方法 | |
CN110058816A (zh) | 一种基于ddr的高速多用户队列管理器及方法 | |
CN115905086A (zh) | 基于axi同步读写单口sram的控制方法及控制器 | |
CN113360098A (zh) | 一种数据写入方法、装置、系统、电子设备及存储介质 | |
CN111163297A (zh) | 一种实现视频监控云存储高并发和快速回放的方法 | |
CN109375868B (zh) | 一种数据存储方法、调度装置、系统、设备及存储介质 | |
CN108647278B (zh) | 一种文件管理方法及系统 | |
CN101783814A (zh) | 海量存储系统的元数据存储方法 | |
CN112463073A (zh) | 一种对象存储分布式配额方法、系统、设备和存储介质 | |
CN112035428A (zh) | 分布式存储系统、方法、装置、电子设备和存储介质 | |
CN105264608A (zh) | 存储数据的方法、内存控制器和中央处理器 | |
US20180309702A1 (en) | Method and device for processing data after restart of node | |
CN112905121B (zh) | 一种数据下刷方法和系统 | |
CN113609245B (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 |