CN114490112A - 消息处理方法、设备及系统 - Google Patents
消息处理方法、设备及系统 Download PDFInfo
- Publication number
- CN114490112A CN114490112A CN202111564807.4A CN202111564807A CN114490112A CN 114490112 A CN114490112 A CN 114490112A CN 202111564807 A CN202111564807 A CN 202111564807A CN 114490112 A CN114490112 A CN 114490112A
- Authority
- CN
- China
- Prior art keywords
- message
- queue
- sub
- consumption
- cache
- 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
- 238000003672 processing method Methods 0.000 title claims abstract description 14
- 238000012545 processing Methods 0.000 claims abstract description 44
- 238000003860 storage Methods 0.000 claims description 102
- 238000000034 method Methods 0.000 claims description 42
- 238000004590 computer program Methods 0.000 claims description 21
- 230000008569 process Effects 0.000 claims description 19
- 230000003139 buffering effect Effects 0.000 claims description 2
- 238000012544 monitoring process Methods 0.000 claims description 2
- 230000009286 beneficial effect Effects 0.000 abstract description 9
- 238000010586 diagram Methods 0.000 description 15
- 230000006870 function Effects 0.000 description 14
- 238000004891 communication Methods 0.000 description 13
- 238000009826 distribution Methods 0.000 description 12
- 238000007726 management method Methods 0.000 description 11
- 238000005516 engineering process Methods 0.000 description 9
- 238000002955 isolation Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000004069 differentiation Effects 0.000 description 2
- 230000014759 maintenance of location Effects 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- 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/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/484—Precedence
-
- 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)
- Data Exchanges In Wide-Area Networks (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本申请实施例提供一种消息处理方法、设备及系统。在本申请实施例中,在消息消费节点引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
Description
技术领域
本申请涉及通信技术领域,尤其涉及一种消息处理方法、设备及系统。
背景技术
消息队列(Message Queue,MQ)是一种基于先进先出(FIFO)的队列模型中间件。消息发送后可以立即返回,由消息系统确保消息的可靠传递。消息生产者(Producer)只需将消息发布到MQ中,无需管谁来取消息和如何取消息;消息消费者(Consumer)只管从MQ中取消息而不用管是谁发布的以及如何发布的。
对于消息消费者来说,一个消息消费者需要消费成千上万个MQ。在现有技术中,经常需要为每个MQ单独分配线程进行消息消费,需要同时创建、启动大量的消费线程,消耗大量的计算机资源。
发明内容
本申请的多个方面提供一种消息处理方法、设备及系统,用以实现资源复用,降低计算机资源消耗。
本申请实施例提供一种消息处理方法,包括:
根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息;
将获取的消息缓存至所述本地缓存区对应的缓存队列;
根据所述至少一个缓存队列承载的消费速度,利用第二线程池从所述本地缓存区获取消息消费者需要消费的目标消息;
将所述目标消息提供给消息消费者,以供所述消息消费者消费所述目标消息。
本申请实施例还提供一种消息处理系统,包括:存储节点和消息消费节点;
所述存储节点,设置有至少一个消费队列;消费队列用于存储消息;
所述消息消费节点包括:数据拉取层、本地缓存层、消息控制层和消息消费者;所述本地缓存层设置有至少一个缓存队列;
所述数据拉取层,维护有第一线程池,用于根据所述至少一个缓存队列的存储能力,利用第一线程池从所述至少一个消息队列获取消息;并将获取的消息缓存至所述至少一个缓存队列;
所述消费控制层,维护有第二线程池,用于根据所述至少一个缓存队列承载的消费速度,利用所述第二线程池从所述至少一个缓存队列获取消息消费者需要消费的目标消息;并将所述目标消息调度至所述消息消费者;
所述消息消费者用于消费所述目标消息。
本申请实施例还提供一种计算设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于执行上述消息处理方法中的步骤。
在本申请实施例中,在消息消费节点引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
另一方面,本申请实施例提供的消息处理系统,在消息消费节点设置本地缓存层,可实现从存储节点拉取消息与消息消费隔离,这样,在消息消费失败时,可将消息重新调度至本地缓存层进行等待消费,等下次消费时,可直接从本地缓存层获取消息,而无需再去访问存储节点,有助于提高消息获取效率,进而提高消息消费效率。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的消息处理系统的结构示意图;
图2为本申请实施例提供的线程池的示意图;
图3和图4为本申请实施例提供的其它消息处理系统的结构示意图;
图5为本申请实施例提供的消费速度进行时间分片的示意图;
图6为本申请实施例提供的消息处理方法的流程示意图;
图7为本申请实施例提供的计算设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在现有技术中,经常需要为每个MQ单独分配线程进行消息消费,需要同时创建、启动大量的消费线程,消耗大量的计算机资源。为了节约计算机资源,在本申请一些实施例中,在消息消费节点引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
以下结合附图,详细说明本申请各实施例提供的技术方案。
应注意到:相同的标号在下面的附图以及实施例中表示同一物体,因此,一旦某一物体在一个附图或实施例中被定义,则在随后的附图和实施例中不需要对其进行进一步讨论。
图1为本申请实施例提供的消息处理系统的结构示意图。如图1所示,该消息处理系统包括:存储节点10和消息消费节点20。
在本实施例中,存储节点10是指具有数据存储功能的服务或实体设备。存储节点10的数量可以为1个或多个。多个是指2个或2个以上。多个存储节点10可以部署在不同容器或虚拟机(VM)中。多个存储节点10可部署在同一物理机,也可以部署于不同的物理机上。
消息消费节点20是指具有消息消费功能的软件模块、应用程序、服务或实体设备。消息消费节点20的数量可以为1个或多个。多个是指2个或2个以上。多个消息消费节点20可以部署在不同容器或虚拟机(VM)中。多个消息消费节点20可部署在同一物理机,也可以部署于不同的物理机上。
在本申请实施例中,不限定物理机的具体实现形态。物理机可以为单一服务器设备,也可以云化的服务器阵列。另外,物理机也可以指具备相应计算能力的其他计算设备,例如电脑等终端设备等。
在本申请实施例中,存储节点10设置有至少一个消息队列。在本申请实施例中,不限定存储节点10存储的消息队列的数量,本申请实施例提供的消息处理方式可适应于任意数量的消息队列,尤其适用于多个消息队列。多个是指2个或2个以上。在本申请实施例中,不限定消息队列的具体数量。对于高并发请求来说,消息队列可为成千上万个,甚至更多。消息队列用于存储消息。本申请实施例提供的消息处理系统可适应于任何需要消息处理的应用场景中。例如,可应用于云通信服务系统、订单调度系统、在线购物系统等等。对于云通信服务系统,对于某个环节的消息生产者产生的消息为短信消息等。对于云通信服务系统,可为每个通信服务供应平台创建多个消息队列。相应地,存储节点10设置多个消息队列。相应地,消息队列用于存储短信消息。消息消费节点20用于消费短信消息,例如,用于将短信信息发送给对应的用户等等。
消息队列可为基于先进先出的队列模型中间件,用于系统之间的消息交互,可以持久化存储。消息队列每一个消息在消息队列中都有其唯一的偏移量,表示其当前在消息队列中的位置。消息在存储节点10可按照偏移量有序且连续存储,消息消费节点20可按照偏移量有序地从消息队列中获取消息进行消费,从而实现先进先出的消息队列模型。
在本申请实施例中,为了实现资源复用,节约消息处理系统的资源消耗,对于消息消费节点20的数据拉取层21,可维护线程池(pool)。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池具有方便管理线程,减少内存的消耗的优势。
如图2所示,线程池可包括:线程池管理器(Thread Pool Manager)、工作线程(Work Thread)和任务队列(work Queue)。其中,线程池管理器用于创建并管理线程池。工作线程为线程池中的线程,可包括:核心线程和非核心线程。核心线程即便在无任务执行处于空闲状态的时候,也不会被销毁。非核心线程是指在空闲时间达到设定的保留时间阈值就销毁的线程。线程池具有最大线程数量(maximum Pool Size)、核心线程数量(core PoolSize)和保留时间(keep Alive Time)等参数。maximum Pool Size是指线程池中可以容纳的最大线程的数量;core Pool Size为线程池中的核心线程数量。keep Alive Time为线程池中非核心线程在空闲时最长可以保留的时间。
任务队列,就是等待队列,用于存放没有处理的任务。线程池可按照FIFIO(先进先出)原则处理任务队列中的任务。
由于线程池维护的核心队列在空闲时不会被销毁,因此,在并发消息需要被处理时,利用线程池处理无需创建和启动大量线程,有助于降低资源消耗。而且,大规模消息队列可以复用线程池中的线程,实现线程资源复用,有助于进一步降低资源消耗。
在本申请实施例中,本地缓存层22设置有至少一个缓存队列。为了便于消息管理,本地缓存层22的缓存队列与存储节点10中的消息队列相对应。例如,一个缓存队列可对应一个消息队列等。缓存队列也可为多个。
对于缓存队列来说,具有缓存容量,即一个缓存队列可缓存的最大消息数量。缓存队列的缓存容量是有限度的。因此,数据拉取层21在从存储节点10拉取消息时,需要考虑本地缓存层22中的缓存队列的存储能力,否则会有消息溢出风险。因此,数据拉取层21可根据本地缓存层22中的至少一个缓存队列的存储能力,利用第一线程池从存储节点10获取消息;并将获取的消息提供给本地缓存层22。本地缓存层22将获取的消息缓存至对应的缓存队列中。
在本申请实施例中,对于消息拉取层21可启动一任务分发线程,如图3中的I/O任务调度器。消息拉取层21可利用该任务分发线程根据本地缓存层22的至少一个缓存队列的存储能力,生成消息拉取任务;并将消息拉取任务提供给消息拉取层21的线程池。
可选地,任务分发线程可根据每个缓存队列的缓存容量和缓存深度,确定每个缓存队列尚可容纳的消息数量;并根据每个缓存队列尚可容纳的消息数量,生成该缓存队列对应的消息拉取任务。其中,缓存队列的缓存容量是指队列可存储的最大深度,即可容纳的最大消息数量。缓存队列的缓存深度是指缓存队列当前存储的消息的深度,可反映当前存储的消息数量。消息拉取任务可包括缓存队列标识及从该缓存队列对应的消息队列中需要拉取的消息数量。其中,从缓存队列对应的消息队列需要拉取的消息数量小于或等于该缓存队列尚可容纳的消息数量。
对于消息拉取层21,可利用该层的线程池执行消息拉取任务,以从存储节点10的相应消息队列中获取消息拉取任务所需的消息。具体地,消息拉取层21可利用线程池确定消息任务对应的消息队列和待拉取的消息数量M。M为正整数,且小于或等于缓存队列尚可容纳的消息数量。进一步,消息拉取层21可利用线程池从存储节点10对应的消息队列中拉取M个消息,作为该消息拉取任务所需的消息。
具体地,消息拉取层21在利用线程池执行消息拉取任务时,可判断核心线程是否有处于空闲状态;若存在核心线程处于空闲状态,利用空闲的核心线程执行消息拉取任务。若核心线程均处于非空闲状态,可判断任务队列是否有空间存放该消息拉取任务;若判断结果为是,可将消息拉取任务保存在任务队列。若判断结果为任务队列满载,可判断线程池当前使用的线程数量是否达到该线程池的最大线程数量,若未达到,则可创建非核心线程执行消息拉取任务。若线程池当前使用的线程数量已达到该线程池的最大线程数量,执行拒绝策略等等。
在本实施例中,消息拉取层21可根据本地缓存层22中的至少一个缓存队列的存储能力,按需从存储节点相应的消息队列中拉取定量的消息,可避免由于拉取消息数量过多导致缓存队列溢出。利用消息拉取层21的线程池执行消息拉取任务,至少一个消息队列对应的消息拉取任务可共享线程池,实现线程池中的线程资源复用,有助于降低消息拉取时的资源消耗。
本地缓存层22可将消息拉取层21拉取的消息缓存至对应的缓存队列。对于消息控制层23可进行消费速度控制,实现至少一个消息队列的负载均衡。具体地,消息控制层23也可维护线程池。在本申请实施例中,为了便于描述和区分,将上述数据拉取层维护的线程池,定义为第一线程池;将消息控制层23维护的线程池,定义为第二线程池。
在本实施例中,消息控制层23可根据至少一个缓存队列承载的消费速度,利用第二线程池从本地缓存层22获取消息消费者需要消费的目标消息;并将目标消息调度至消息消费者24。消息消费者24可对目标消息进行消费。
在本申请实施例中,缓存队列承载的消费速度是指该缓存队列中的消息被消费的速度,可以每秒查询率(Queries-per-second,qps)进行衡量。例如,缓存队列承载的消费速度为1000qps,说明该缓存队列中的消息的被消费速度为1000qps,即每秒1000个消息被消费。
在本实施例中,根据至少一个缓存队列承载的消费速度,按需从缓存队列获取目标消息,可控制缓存队列的消费速度,实现限流控制。
可选地,如图3和图4所示,对于消息控制层23可开启任务调度线程,即图3所示的缓存任务调度器。该任务调度线程根据至少一个缓存队列承载的消费速度,生成多个消息调度任务。其中,消费任务包括待获取的消息数量及缓存队列的标识。缓存队列的标识用于标识从哪个缓存队列获取消息。进一步,消息控制层23可将多个消费任务提供至消息控制层23。消息控制层23可利用第二线程池按照消息调度任务对应的执行周期,周期性地执行每个缓存队列对应的消费任务;并在执行消费任务过程中,从缓存队列中获取当前周期执行的消息调度任务需要调度的消息,作为目标消息。
进一步,消息控制层23可将目标消息提供给消息消费者。对于消息控制层23在将目标消息调度至消息消费者24时,可随机将目标消息分配给任一消息消费者;也可采用设定的调度方式选择消息消费者。例如,可采用哈希(Hash)环算法确定目标消息对应的消息消费者;并将目标消息提供给确定出的消息消费者24。
对于哈希环算法可理解为:首先,将Hash函数的值空间组成一个环;然后,利用Hash函数对消息消费者进行哈希处理,得到消息消费者在环上的位置;并利用Hash函数对目标消息进行哈希处理,得到目标消息在环上的位置;然后从目标消息在环上的位置出发,并确定遍历到的第一个消息消费者为目标消息对应的消息消费者。
进一步,消息控制层23可将目标消息提供给确定出的消息消费者24。该消息消费者24可对目标消息进行消费。
在本申请实施例中,不限定消息消费者24对目标消息进行消费的具体实施方式。在一些实施例中,如图1、图3和图4所示,消息消费者24可维护一个线程池。为了便于描述和区分,将消息消费者24维护的线程池,定义为第三线程池。第三线程池用于处理消息消费任务。消息消费任务是指对消息进行消费的任务。
在本申请实施例中,消息消费者24可利用第三线程池处理消息消费任务,以消费目标消息。
在本申请实施例中,在消息消费节点引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
另一方面,本申请实施例提供的消息处理系统,在消息消费节点设置本地缓存层,可实现从存储节点拉取消息与消息消费隔离,这样,在消息消费失败时,可将消息重新调度至本地缓存层进行等待消费,等下次消费时,可直接从本地缓存层获取消息,而无需再去访问存储节点,有助于提高消息获取效率,进而提高消息消费效率。
在本申请实施例中,如图4所示,考虑到频繁从一消息队列或缓存队列中获取消息,会产生大量输入/输出(I/O)操作,对消息处理系统的稳定性有一定影响,因此,在本申请实施例中,可将任一消息队列拆分成多个消息子队列,由消息子队列共同承担消息队列的消费速度。相应地,本地缓存层22中的任一缓存队列也被拆分成多个缓存子队列。消息子队列与缓存子队列一一对应。
进一步,不同类型的消息的消费优先级不同,时效性要求越高的消息的消费优先级越高。例如,对于即时通信消息比邮件的时效性要高,因此,即时通信消息的消费优先级大于邮件的消费优先级。为了对消息进行消费优先级区分,在本申请实施例中,可使每个消息子队列存储处于同一消费优先级的消息;当然,每个缓存子队列也存储处于同一消费优先级的消息。
在本申请实施例中,为了实现缓存队列的消息消费的负载均衡,可将多个缓存子队列划分至多个子队列组;每个子队列组包含所有消费优先级的缓存子队列。例如,若消费优先级分为高中低三个优先级,则每个子队列组包含消费优先级为高中低的三个缓存子队列。在本申请实施例中,如图4所示,消息处理系统还可包括:注册中心节点30。其中,注册中心节点30是指消息队列和缓存队列进行管理的软件功能模块、服务或实体设备。注册中心节点30与消息消费节点20可部署于同一物理机,也可部署于不同的物理机。
在本申请实施例中,在对缓存队列划分消息子队列时,针对任一缓存队列,注册中心节点30可根据该缓存队列承载的消费速度、预设的子队列组承载的消费速度和消息优先级数量,将该缓存队列划分为多个缓存子队列。其中,缓存队列对应的缓存子队列的数量由缓存队列承载的消费速度、预设的子队列组承载的消费速度和消息优先级数量决定。例如,缓存队列承载的消费速度为1000pqs、预设的子队列组承载的消费速度为50qps、消费优先级为高中低三个优先级,则需要的子队列组的数量为20个;由于每个子队列组包含高中低三个优先级的缓存子队列,则缓存子队列的数量可为20*3=60个。
在本申请实施例中,子队列组为最小的消费速度分配单元,子队列组中的缓存子队列共享消费速度。基于上述缓存子队列,消息拉取层21可启动任务分发线程,根据至少一个缓存队列对应的多个缓存子队列的存储能力,生成多个消息拉取任务。具体地,针对任一缓存子队列,可根据该缓存子队列的缓存容量和缓存深度,确定该缓存子队列尚可容纳的消息数量;并根据每个缓存子队列尚可容纳的消息数量,生成该缓存子队列对应的消息拉取任务。该消息拉取任务可包括待拉取的消息数量M和消息子队列的标识。其中,M为正整数,且小于或等于该缓存子队列尚可容纳的消息数量。消息子队列的标识用于标识从存储节点10中的哪个消息子队列拉取消息。
进一步,任务分发线程可将多个消息拉取任务提供给消息拉取层21的第一线程池。消息拉取层21可利用第一线程池执行多个消息拉取任务;并在执行消息拉取任务过程中,从存储节点的相应消息子队列中获取多个消息拉取任务分别所需的消息。可选地,消息拉取层21可根据设定的拉取周期,周期性地利用第一线程池执行消息拉取任务,以从存储节点的相应消息子队列中获取当前拉取周期执行的消息拉取任务所需的消息。其中,存储节点的相应消息子队列为当前周期执行的消息拉取任务携带的消息子队列标识对应的消息子队列。
进一步,消息拉取层21可将当前周期拉取的消息提供给本地缓存层22。本地缓存层22可将该消息存储至消息子队列对应的缓存子队列中。
在实际使用过程中,也可能存在消息拉取层拉取不到消息的情况。例如,消息生产着未有新的消息产生,或者消息子队列中的消息被全部拉取等等。基于此,针对任一缓存子队列,若未从存储节点10获取该缓存子队列对应的消息拉取任务所需的消息的连续次数达到设定阈值,可降低第一线程池执行该缓存子队列对应的消息拉取任务的频率。这样,可降低消息无效拉取的频次,有助于降低消息拉取时的资源消耗。
在本申请实施例中,不限定连续次数阈值的具体取值。优选地,连续次数阈值为大于2的整数,如3次、5次等。当然,在本申请实施例中,也不限定降低第一线程池执行该缓存子队列对应的消息拉取任务的频率的具体实施方式。例如,可按照设定的梯度,在每次未拉取到缓存子队列对应的消息拉取任务所需的消息时,将执行该缓存子队列对应的消息拉取任务的频率依次降低设定的梯度。又例如,可将执行该缓存子队列对应的消息拉取任务的频率降低到设定的频率等等。
在本申请实施例中,为了保障消息按照先入先出的原则有序拉取,消息消费节点20可为每个缓存子队列维护一个拉取偏移量(pull Offset),表示该缓存子队列从存储节点10中已拉取到的消息的最大偏移量。如图3所示,可在消息消费节点20设置消费进度管理层25,该消费进度管理层25可维护拉取偏移量。相应地,针对任一缓存子队列,在从存储节点拉取到的消息缓存至该缓存子队列的情况下,消费进度管理层25可根据拉取到的消息的偏移量,更新本地拉取偏移量。
基于上述缓存队列对应的子队列组,消息控制层23可根据每个子队列组承载的消费速度,利用第二线程池从本地缓存层22获取消息消费者需要的目标消息。具体地,消息控制层23可启动一任务分发线程。该任务分发线程可根据每个缓存队列分别对应的多个子队列组承载的消费速度,生成多个消息调度任务。具体地,针对任一子队列组,根据任一子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N;N为正整数;并根据该子队列组当次需要被消费的消息数量N,生成该子队列组对应的消息调度任务。其中,消息调度任务可包括当次需要被消费的消息数量N及子队列组的标识。其中,子队列组的标识用于标识从哪个子队列组获取消息。
在本申请实施例中,在根据子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N时,可直接确定子队列组的消费速度对应的消息数量,作为该子队列组当次需要被消息的消息数量。例如,子队列组的消费速度为50qps,则确定该子队列当次需要被消费的消息数量N为50。
由于等待消息的缓存子队列组众多,并且采用缓存子队列组共享第二线程池的方式,为了保障每个缓存子队列组的消费速度,在根据子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N时,可对任一子队列组的消费速度进行时间分片,以得到每个时间分片需要消费的消息数量;确定每个时间分片需要消费的消息数量为当前次需要消费的消息数量N。例如,如图5所示,子队列组的消费速度为50qps,则可以0.2s为一个时间分片,对子队列组的消费速度进行时间分片。在这样的前提下,该子队列组每秒的消费任务被划分为5个子任务,每0.2s执行一次子任务,每次消费10个消息。即每个时间分片需要消费的消息数量为10个。这样,既控制了子队列组的消费速度,也可保障在单位时间内消息消费速度相对稳定,有助于提高消息处理系统的消费稳定性。
消息控制层23中的任务分发线程在生成各子队列组对于的消息调度任务之后,可将消息调度任务提供至消息控制层23中的第二线程池。进一步,消息控制层23可利用第二线程池按照消息调度任务对应的执行周期,周期性地执行每个子队列组对应的消息调度任务;并在执行每个子队列组对应的消息调度任务的过程中,从本地缓存层22对应的子队列组中获取当前周期执行的消息调度任务所需的消息,作为上述目标消息。其中,消息调度任务的执行周期可由子队列组的消费速度决定,每个执行周期从子队列组获取当前执行周期的消息速度对应数量的消息,实现消费速度控制,具有流量控制作用。
在本申请实施例中,对于直接确定子队列组的消费速度对应的消息数量的实施例,消息控制层23执行消息调度任务的执行周期为消费速度对应的时间单位。例如,子队列组的消费速度为50qps,则消息控制层23执行消息调度任务的执行周期为1秒。
对于上述对子队列组的消费速度进行时间分片的实施例,消息控制层23执行消息调度任务的执行周期为一个时间分片。相应地,消息控制层23可利用第二线程池以时间分片为执行周期,周期性地执行子队列组对应的消息调度任务。由于单位时间内的每个时间分片分担消费速度,既可以控制整个子队列组的消费速度,也可单位时间内的每个时间分片消费速度稳定,进而保障在单位时间内消息消费速度相对稳定,有助于提高消息处理系统的消费稳定性。
在一些实施例中,子队列组中的缓存子队列具有消费优先级之分。针对缓存子队列具有消费优先级的子队列组,可按照子队列组中的缓存子队列的消费优先级从高到低的顺序,从消息调度任务对应的子队列组中获取N个消息,作为该消息调度任务对应的子队列组的目标消息。
对于消息控制层23在根据子队列组的消费速度,从本地缓存层22获取与消息速度匹配的目标消息之后,可将目标消息提供给消息消费者24。消息消费者24可对目标消息进行消费。
在本申请实施例中,不限定将目标消息提供给消息消费者24的具体实施方式。在一些实施例中,消息控制层23在将每个在队列组的目标消息调度至消息消费者24时,可随机将每个子队列组的目标消息分配给任一消息消费者;也可由注册中心节点30采用设定的调度方式选择消息消费者。例如,如图4所示,注册中心节点30可采用哈希(Hash)环算法确定多个子队列组分别对应的消息消费者;并将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者24。
对于哈希环算法可理解为:首先,将Hash函数的值空间组成一个环;然后,利用Hash函数对每个消息消费者进行哈希处理,得到多个消息消费者在环上的位置;并利用Hash函数对每个子队列组进行哈希处理,得到子队列组在环上的位置;然后从子队列组在环上的位置出发,并确定遍历到的第一个消息消费者为该子队列组对应的消息消费者。
进一步,消息控制层23可将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者24。每个子队列组对应的消息消费者对该子队列组提供的目标消息进行消费。
在本申请实施例中,不限定消息消费者24消费消息的具体实施方式。在一些实施例中,如图1所示,消息消费者24可维护一个线程池。为了便于描述和区分,将消息消费者24维护的线程池,定义为第三线程池。第三线程池用于处理消息消费任务。消息消费任务是指对消息进行消费的任务。
在本申请实施例中,消息消费者24可利用第三线程池处理消息消费任务,以消费目标消息。具体地,消息消费者24可启动一任务分发线程。该任务分发线程可生成消息消费任务。可选地,任务分发线程可根据上述消息调度任务的执行周期,生成消息消费任务。一个消息消费任务执行一个消息调度任务获取的消息。进一步,该任务分发线程可将消息消费任务提供给第三线程池。如图3所示,第三线程池可按需从任务队列中取出消息消费任务;并处理消息消费任务,以消费该消息消费任务对应的目标消息。
可选地,在一些实施例中,可利用第三线程池远程调用其它处理单元处理消息消费任务;并在消息消费任务执行完成的情况下,即该消息消费任务对应的目标消息消费完成的情况下,发出确认(ACK)消息。
在本申请实施例中,为了保障消息按照先入先出的原则有序消费,消息消费节点20还可为每个缓存子队列维护一消费偏移量,该消费偏移量可表示消息消费者24已消费成功的每个缓存子队列中的消息的最大偏移量。其中,消息偏移量可维护在消息进度管理层25中。
消息进度管理层25可监测消息消费者对目标消息的消费状态;若消息消费者对目标消息的消费状态为消费成功,可根据目标消息的偏移量,更新目标消息所在的缓存子队列对应的本地消费偏移量。可选地,消息进度管理层25还可维护一临时列表,在目标消息消费成功后,可将该目标消息的偏移量存储至临时列表;并定期查询该临时列表,若在该临时列表中查询到偏移量等于本地消费偏移量+1的偏移量,则将目标消息所在的缓存子队列对应的本地消费偏移量加1。
对于消息消费节点20维护的上述拉取偏移量和消息消费偏移量,可定期将上述拉取偏移量和消息消费偏移量持久化至存储节点10,防止拉取偏移量和消息消费偏移量丢失。
对于消息进度管理层25监测到消息消费者对目标消息的消费状态为消费失败,可将目标消息重新调度至本地缓存层22对应的缓存子队列中。其中,本地缓存层22对应的缓存子队列是指目标消息所在的缓存子队列。这样,目标消息可在缓存子队列中等待重新被消费,而无需再次去存储节点10拉取该目标消息,可提高再次消息消费时,消息获取效率,进而提高消息消费效率。
除了上述实施例提供的消息处理系统之外,本申请实施例还提供消息处理方法,下面对本申请实施例提供的消息处理方法进行示例性说明。
图6为本申请实施例提供的消息处理方法的流程示意图。如图6所示,该消息处理方法包括:
601、根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息。
602、将获取的消息缓存至本地缓存区对应的缓存队列。
603、根据至少一个缓存队列承载的消费速度,利用第二线程池从本地缓存区获取消息消费者需要消费的目标消息。
604、将目标消息提供给消息消费者,以供消息消费者消费目标消息。
在本申请实施例中,在本申请实施例中,存储节点设置有至少一个消息队列。一般地,消息队列的数量为多个。消息队列每一个消息在消息队列中都有其唯一的偏移量,表示其当前在消息队列中的位置。消息在消息队列中可按照偏移量有序且连续存储,可按照偏移量有序地从消息队列中获取消息进行消费,从而实现先进先出的消息队列模型。
在本申请实施例中,本地缓存区设置有至少一个缓存队列。为了便于消息管理,本地缓存区的缓存队列与存储节点中的消息队列相对应。例如,一个缓存队列可对应一个消息队列等。
对于缓存队列来说,具有缓存容量,即一个缓存队列可缓存的最大消息数量。缓存队列的缓存容量是有限度的。因此,在存储节点拉取消息时,需要考虑本地存储区中的缓存队列的存储能力,否则会有消息溢出风险。因此,在步骤601中,可根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息;并在步骤602中,将获取的消息缓存至本地缓存区对应的缓存队列。
在本申请实施例中,可根据本地缓存区的至少一个缓存队列的存储能力,生成消息拉取任务;并将消息拉取任务提供给消息拉取层的线程池。
可选地,可根据每个缓存队列的缓存容量和缓存深度,确定每个缓存队列尚可容纳的消息数量;并根据每个缓存队列尚可容纳的消息数量,生成该缓存队列对应的消息拉取任务。其中,关于缓存容量和缓存深度的描述可参见上述系统实施例的相关内容,在此不再赘述。消息拉取任务可包括缓存队列标识及从该缓存队列对应的消息队列中需要拉取的消息数量。其中,从缓存队列对应的消息队列需要拉取的消息数量小于或等于该缓存队列尚可容纳的消息数量。
进一步,可利用第一线程池执行消息拉取任务,以从存储节点的相应消息队列中获取消息拉取任务所需的消息。具体地,可利用第一线程池确定消息任务对应的消息队列和待拉取的消息数量M。M为正整数,且小于或等于缓存队列尚可容纳的消息数量。进一步,可利用第一线程池从存储节点对应的消息队列中拉取M个消息,作为该消息拉取任务所需的消息。关于利用第一线程池执行消息拉取任务的具体实施方式,可参见上述系统实施例的相关内容,在此不再赘述。
在本实施例中,根据本地缓存层中的至少一个缓存队列的存储能力,按需从存储节点相应的消息队列中拉取定量的消息,可避免由于拉取消息数量过多导致缓存队列溢出。利用线程池执行消息拉取任务,至少一个消息队列对应的消息拉取任务可共享线程池,实现线程池中的线程资源复用,有助于降低消息拉取时的资源消耗。
进一步,可对缓存队列进行消费速度控制,实现至少一个消息队列的负载均衡。相应地,在步骤603中,可根据至少一个缓存队列承载的消费速度,利用第二线程池从本地缓存区获取消息消费者需要消费的目标消息;并在步骤604中,将目标消息提供给消息消费者。消息消费者、可对目标消息进行消费。
在本实施例中,根据至少一个缓存队列承载的消费速度,按需从缓存队列获取目标消息,可控制缓存队列的消费速度,实现限流控制。
可选地,可根据至少一个缓存队列承载的消费速度,生成多个消息调度任务。其中,消费任务包括待获取的消息数量及缓存队列的标识。缓存队列的标识用于标识从哪个缓存队列获取消息。进一步,可利用第二线程池按照消息调度任务对应的执行周期,周期性地执行每个缓存队列对应的消费任务;并在执行消费任务过程中,从缓存队列中获取当前周期执行的消息调度任务需要调度的消息,作为目标消息。
进一步,可将目标消息提供给消息消费者。可选地,可随机将目标消息分配给任一消息消费者;也可采用设定的调度方式选择消息消费者。例如,可采用哈希(Hash)环算法确定目标消息对应的消息消费者;并将目标消息提供给确定出的消息消费者,等等。
进一步,可将目标消息提供给确定出的消息消费者。该消息消费者可对目标消息进行消费。可选地,可利用第三线程池处理消息消费任务,以消费目标消息。
在本申请实施例中,在消息消费节点引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
另一方面,本申请实施例提供的消息处理系统,在消息消费节点设置本地缓存层,可实现从存储节点拉取消息与消息消费隔离,这样,在消息消费失败时,可将消息重新调度至本地缓存层进行等待消费,等下次消费时,可直接从本地缓存层获取消息,而无需再去访问存储节点,有助于提高消息获取效率,进而提高消息消费效率。
在本申请实施例中,考虑到频繁从一消息队列或缓存队列中获取消息,会产生大量输入/输出(I/O)操作,对消息处理系统的稳定性有一定影响,因此,在本申请实施例中,针对任一缓存队列,可根据该缓存队列承载的消费速度、预设的子队列组承载的消费速度和消息优先级数量,将该缓存队列划分为多个缓存子队列。其中,缓存队列对应的缓存子队列的数量由缓存队列承载的消费速度、预设的子队列组承载的消费速度和消息优先级数量决定。
在本申请实施例中,子队列组为最小的消费速度分配单元,子队列组中的缓存子队列共享消费速度。基于上述缓存子队列,可根据至少一个缓存队列对应的多个缓存子队列的存储能力,生成多个消息拉取任务。具体地,针对任一缓存子队列,可根据该缓存子队列的缓存容量和缓存深度,确定该缓存子队列尚可容纳的消息数量;并根据每个缓存子队列尚可容纳的消息数量,生成该缓存子队列对应的消息拉取任务。该消息拉取任务可包括待拉取的消息数量M和消息子队列的标识。其中,M为正整数,且小于或等于该缓存子队列尚可容纳的消息数量。消息子队列的标识用于标识从存储节点、中的哪个消息子队列拉取消息。
进一步,可将多个消息拉取任务提供给第一线程池;并利用第一线程池执行多个消息拉取任务;并在执行消息拉取任务过程中,从存储节点的相应消息子队列中获取多个消息拉取任务分别所需的消息。可选地,可根据设定的拉取周期,周期性地利用第一线程池执行消息拉取任务,以从存储节点的相应消息子队列中获取当前拉取周期执行的消息拉取任务所需的消息。其中,存储节点的相应消息子队列为当前周期执行的消息拉取任务携带的消息子队列标识对应的消息子队列。
进一步,可将当前周期拉取的消息提供给本地缓存层区。本地缓存区可将该消息存储至消息子队列对应的缓存子队列中。
在实际使用过程中,也可能存在消息拉取层拉取不到消息的情况。例如,消息生产着未有新的消息产生,或者消息子队列中的消息被全部拉取等等。基于此,针对任一缓存子队列,若未从存储节点获取该缓存子队列对应的消息拉取任务所需的消息的连续次数达到设定阈值,可降低第一线程池执行该缓存子队列对应的消息拉取任务的频率。这样,可降低消息无效拉取的频次,有助于降低消息拉取时的资源消耗。
在本申请实施例中,为了保障消息按照先入先出的原则有序拉取,可为每个缓存子队列维护一个拉取偏移量(pull Offset),表示该缓存子队列从存储节点中已拉取到的消息的最大偏移量。相应地,针对任一缓存子队列,在从存储节点拉取到的消息缓存至该缓存子队列的情况下,可根据拉取到的消息的偏移量,更新本地拉取偏移量。
基于上述缓存队列对应的子队列组,可根据每个子队列组承载的消费速度,利用第二线程池从本地缓存区获取消息消费者需要的目标消息。可选地,可根据至少一个缓存队列分别对应的多个子队列组承载的消费速度,生成多个消息调度任务。具体地,针对任一子队列组,根据任一子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N;N为正整数;并根据该子队列组当次需要被消费的消息数量N,生成该子队列组对应的消息调度任务。其中,消息调度任务可包括当次需要被消费的消息数量N及子队列组的标识。其中,子队列组的标识用于标识从哪个子队列组获取消息。
在本申请实施例中,在根据子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N时,可直接确定子队列组的消费速度对应的消息数量,作为该子队列组当次需要被消息的消息数量。
由于等待消息的缓存子队列组众多,并且采用缓存子队列组共享第二线程池的方式,为了保障每个缓存子队列组的消费速度,在根据子队列组的消费速度,确定该子队列组当次需要被消费的消息数量N时,可对任一子队列组的消费速度进行时间分片,以得到每个时间分片需要消费的消息数量;确定每个时间分片需要消费的消息数量为当前次需要消费的消息数量N。这样,既控制了子队列组的消费速度,也可保障在单位时间内消息消费速度相对稳定,有助于提高消息处理系统的消费稳定性。
进一步,可利用第二线程池按照消息调度任务对应的执行周期,周期性地执行每个子队列组对应的消息调度任务;并在执行每个子队列组对应的消息调度任务的过程中,从本地缓存区对应的子队列组中获取当前周期执行的消息调度任务所需的消息,作为上述目标消息。其中,消息调度任务的执行周期可由子队列组的消费速度决定,每个执行周期从子队列组获取当前执行周期的消息速度对应数量的消息,实现消费速度控制,具有流量控制作用。
在本申请实施例中,对于直接确定子队列组的消费速度对应的消息数量的实施例,执行消息调度任务的执行周期为消费速度对应的时间单位。
对于上述对子队列组的消费速度进行时间分片的实施例,执行消息调度任务的执行周期为一个时间分片。相应地,可利用第二线程池以时间分片为执行周期,周期性地执行子队列组对应的消息调度任务。由于单位时间内的每个时间分片分担消费速度,既可以控制整个子队列组的消费速度,也可单位时间内的每个时间分片消费速度稳定,进而保障在单位时间内消息消费速度相对稳定,有助于提高消息处理系统的消费稳定性。
在一些实施例中,子队列组中的缓存子队列具有消费优先级之分。针对缓存子队列具有消费优先级的子队列组,可按照子队列组中的缓存子队列的消费优先级从高到低的顺序,从消息调度任务对应的子队列组中获取N个消息,作为该消息调度任务对应的子队列组的目标消息。
在从本地缓存区获取与消息速度匹配的目标消息之后,可将目标消息提供给消息消费。消息消费者可对目标消息进行消费。
在本申请实施例中,不限定将目标消息提供给消息消费者的具体实施方式。在一些实施例中,可随机将每个子队列组的目标消息分配给任一消息消费者;也可采用设定的调度方式选择消息消费者。例如,可采用哈希(Hash)环算法确定多个子队列组分别对应的消息消费者;并将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者。
进一步,可将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者。每个子队列组对应的消息消费者对该子队列组提供的目标消息进行消费。关于消息消费者消费消息的具体实施方式,可参见上述系统实施例的相关内容,在此不再赘述。
在本申请实施例中,为了保障消息按照先入先出的原则有序消费,还可为每个缓存子队列维护一消费偏移量,该消费偏移量可表示消息消费者已消费成功的每个缓存子队列中的消息的最大偏移量。
相应地,可监测消息消费者对目标消息的消费状态;若消息消费者对目标消息的消费状态为消费成功,可根据目标消息的偏移量,更新目标消息所在的缓存子队列对应的本地消费偏移量。可选地,还可维护一临时列表,在目标消息消费成功后,可将该目标消息的偏移量存储至临时列表;并定期查询该临时列表,若在该临时列表中查询到偏移量等于本地消费偏移量+1的偏移量,则将目标消息所在的缓存子队列对应的本地消费偏移量加1。
对于维护的上述拉取偏移量和消息消费偏移量,可定期将上述拉取偏移量和消息消费偏移量持久化至存储节点,防止拉取偏移量和消息消费偏移量丢失。
对于监测到消息消费者对所述目标消息的消费状态为消费失败,可将目标消息重新调度至本地缓存区对应的缓存子队列中。其中,本地缓存区对应的缓存子队列是指目标消息所在的缓存子队列。这样,目标消息可在缓存子队列中等待重新被消费,而无需再次去存储节点拉取该目标消息,可提高再次消息消费时,消息获取效率,进而提高消息消费效率。
需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤601和602的执行主体可以为设备A;又比如,步骤601的执行主体可以为设备A,步骤602的执行主体可以为设备B;等等。
另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如603、604等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
相应地,本申请实施例还提供一种存储有计算机指令的计算机可读存储介质,当计算机指令被一个或多个处理器执行时,致使一个或多个处理器执行上述消息处理方法中的步骤。
本申请实施例还提供一种计算机程序产品,该计算机程序产品包括:计算机程序。当计算机程序被处理器执行时,执行处理器执行上述消息处理方法中的步骤。在本申请实施例中,不限定计算机程序产品的实现形态。在一些实施例中,计算机程序产品可实现为消息队列中间件、插件等。
图7为本申请实施例提供的计算设备的结构示意图。如图7所示,计算设备包括:存储器70a和处理器70b。其中,存储器70a,用于存储计算机程序。
处理器70b耦合至存储器70a,用于执行计算机程序以用于:根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息;将获取的消息缓存至本地缓存区对应的缓存队列;根据至少一个缓存队列承载的消费速度,利用第二线程池从本地缓存区获取消息消费者需要消费的目标消息;并将目标消息提供给消息消费者,以供消息消费者消费目标消息。
其中,存储节点中的至少一个消息队列与至少一个缓存队列相对应。相应地,处理器70b在利用第一线程池从远端存储节点获取消息时,具体用于:根据本地缓存区的至少一个缓存队列的存储能力,生成消息拉取任务;利用第一线程池执行消息拉取任务,以从存储节点的相应消息队列中获取消息拉取任务所需的消息。
进一步,处理器70b在生成消息拉取任务时,具体用于:根据每个缓存队列的缓存容量和缓存深度,确定该缓存队列尚可容纳的消息数量;根据每个缓存队列尚可容纳的消息数量,生成该缓存队列对应的消息拉取任务。
可选地,处理器70b在利用第一线程池执行消息拉取任务时,具体用于:利用第一线程池确定消息拉取任务对应的消息队列和待拉取的消息数量M;M为正整数;从远端存储节点对应的消息队列中拉取M个消息,作为消息拉取任务所需的消息。
在一些实施例中,处理器70b还用于:针对任一缓存队列,根据任一缓存队列承载的消费速度、预设的子队列组承载的消费速度和消费优先级数量,将任一缓存队列划分为多个缓存子队列;同一缓存子队列用于缓存处于同一消费优先级的消息;并根据多个缓存子队列组对应的消费优先级,将多个缓存子队列划分至多个子队列组;其中,每个子队列组包含所有消费优先级的缓存子队列。
其中,存储节点中的多个消息子队列与多个缓存子队列相对应。相应地,处理器70b在利用第一线程池从存储节点获取消息时,具体用于:根据至少一个缓存队列分别对应的多个缓存子队列的存储能力,生成多个消息拉取任务;利用第一线程池执行多个消息拉取任务,以从存储节点的相应消息子队列中获取多个消息拉取任务分别所需的消息。
可选地,处理器70b还用于:针对任一缓存子队列,若未从远端存储节点获取任一缓存子队列对应的消息拉取任务所需的消息的连续次数达到设定阈值,降低第一线程池执行任一缓存子队列对应的消息拉取任务的频率。
可选地,处理器70b还用于:针对任一缓存子队列,在从远端存储节点获取任一缓存子队列对应的消息拉取任务所需的消息的情况下,根据任一缓存子队列对应的消息拉取任务所需的消息的偏移量,更新本地拉取偏移量。在一些实施例中,处理器70b在利用第二线程池从本地缓存区获取消息消费者需要消费的目标消息时,具体用于:根据至少一个缓存队列分别对应的子队列组承载的消费速度,生成多个消息调度任务;利用到第二线程池按照消息调度任务对应的执行周期,周期性地执行每个子队列组对应的消息调度任务;并在执行每个子队列组对应的消息调度任务的过程中,从本地缓冲区对应的子队列组中获取当前周期执行的消息调度任务所需的消息,作为目标消息。
进一步,处理器70b在生成多个消息调度任务时,具体用于:针对任一子队列组,根据任一子队列组的消费速度,确定任一子队列组当次需要被消费的消息数量N;N为正整数;根据任一子队列组当次需要被消费的消息数量N,生成任一子队列组对应的消息调度任务。
可选地,处理器70b在确定任一子队列组当次需要被消费的消息数量N时,具体用于:对任一子队列组的消费速度进行时间分片,以得到每个时间分片需要消费的消息数量;确定每个时间分片需要消费的消息数量为当前次需要消费的消息数量N。
相应地,处理器70b在执行每个子队列组对应的消费任务时,具体用于:利用第二线程池以时间分片为执行周期,周期性地执行任一子队列组对应的消费任务。
可选地,处理器70b在从本地缓存区对应的缓存子队列组中获取多个消息调度任务所需的消息时,具体用于:针对任一消息调度任务对应的子队列组,按照子队列组中的缓存子队列的消费优先级从高到低的顺序,从任一消息调度任务对应的子队列组中获取N个消息,作为任一消息调度任务对应的子队列组的目标消息。
在另一些实施例中,处理器70b在将目标消息提供给消息消费者时,具体用于:采用哈希环算法确定多个子队列组对应的消息消费者;将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者,以供每个子队列组对应的消息消费者对该子队列组提供的目标消息进行消费。
在又一些实施例中,处理器70b还用于:监测消息消费者对目标消息的消费状态;若消息消费者对目标消息的消费状态为消费成功,根据目标消息的偏移量,更新本地消费偏移量;相应地,若消息消费者对目标消息的消费状态为消费失败,将目标消息重新调度至本地缓存区对应的缓存子队列中。
在一些可选实施方式中,如图7所示,该计算设备还可以包括:通信组件70c、电源组件70d等组件。图7中仅示意性给出部分组件,并不意味着计算设备必须包含图7所示全部组件,也不意味着计算设备只能包括图7所示组件。
本实施例提供的计算设备可实现为消息消费节点,引入多个共享线程池,使得消息队列共享线程池中的线程池资源,实现线程池中的线程针对消息队列复用,而无需为每个消息队列单独创建线程,有助于降低大规模消息队列处理时的资源消耗。
另一方面,计算设备设置本地缓存区,可实现从存储节点拉取消息与消息消费隔离,这样,在消息消费失败时,可将消息重新调度至本地缓存层进行等待消费,等下次消费时,可直接从本地缓存层获取消息,而无需再去访问存储节点,有助于提高消息获取效率,进而提高消息消费效率。
在本申请实施例中,存储器用于存储计算机程序,并可被配置为存储其它各种数据以支持在其所在设备上的操作。其中,处理器可执行存储器中存储的计算机程序,以实现相应控制逻辑。存储器可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
在本申请实施例中,处理器可以为任意可执行上述方法逻辑的硬件处理设备。可选地,处理器可以为中央处理器(Central Processing Unit,CPU)、图形处理器(GraphicsProcessing Unit,GPU)或微控制单元(Microcontroller Unit,MCU);也可以为现场可编程门阵列(Field-Programmable Gate Array,FPGA)、可编程阵列逻辑器件(ProgrammableArray Logic,PAL)、通用阵列逻辑器件(General Array Logic,GAL)、复杂可编程逻辑器件(Complex Programmable Logic Device,CPLD)等可编程器件;或者为先进精简指令集(RISC)处理器(Advanced RISC Machines,ARM)或系统芯片(System on Chip,SOC)等等,但不限于此。
在本申请实施例中,通信组件被配置为便于其所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如WiFi,2G或3G,4G,5G或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件还可基于近场通信(NFC)技术、射频识别(RFID)技术、红外数据协会(IrDA)技术、超宽带(UWB)技术、蓝牙(BT)技术或其他技术来实现。
在本申请实施例中,电源组件被配置为其所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机的存储介质为可读存储介质,也可称为可读介质。可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (14)
1.一种消息处理方法,其特征在于,包括:
根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息;
将获取的消息缓存至所述本地缓存区对应的缓存队列;
根据所述至少一个缓存队列承载的消费速度,利用第二线程池从所述本地缓存区获取消息消费者需要消费的目标消息;
将所述目标消息提供给消息消费者,以供所述消息消费者消费所述目标消息。
2.根据权利要求1所述的方法,其特征在于,还包括:
针对所述至少一个缓存队列中的任一缓存队列,根据所述任一缓存队列承载的消费速度、预设的子队列组承载的消费速度和消费优先级数量,将所述任一缓存队列划分为至少一个缓存子队列;同一缓存子队列用于缓存处于同一消费优先级的消息;
根据所述至少一个缓存子队列组对应的消费优先级,将所述至少一个缓存子队列划分至至少一个子队列组;其中,每个子队列组包含所有消费优先级的缓存子队列。
3.根据权利要求2所述的方法,其特征在于,所述存储节点中的至少一个消息子队列与所述至少一个缓存子队列相对应;
所述根据本地缓存区中的至少一个缓存队列的存储能力,利用第一线程池从存储节点获取消息,包括:
根据所述至少一个缓存队列分别对应的至少一个缓存子队列的存储能力,生成至少一个消息拉取任务;
利用所述第一线程池执行所述至少一个消息拉取任务,以从存储节点的相应消息子队列中获取所述至少一个消息拉取任务分别所需的消息。
4.根据权利要求3所述的方法,其特征在于,还包括:
针对任一缓存子队列,若未从所述存储节点获取所述任一缓存子队列对应的消息拉取任务所需的消息的连续次数达到设定阈值,降低所述第一线程池执行所述任一缓存子队列对应的消息拉取任务的频率。
5.根据权利要求2所述的方法,其特征在于,所述根据所述至少一个缓存队列承载的消费速度,利用第二线程池从所述本地缓存区获取消息消费者需要消费的目标消息,包括:
根据所述至少一个缓存队列分别对应的子队列组承载的消费速度,生成多个消息调度任务;
利用所述第二线程池按照所述消息调度任务对应的执行周期,周期性地执行每个子队列组对应的消息调度任务;
在执行所述执行每个子队列组对应的消息调度任务的过程中,从所述本地缓冲区对应的子队列组中获取当前周期执行的消息调度任务所需的消息,作为所述目标消息。
6.根据权利要求5所述的方法,其特征在于,所述根据所述至少一个缓存队列分别对应的子队列组承载的消费速度,生成多个消息调度任务,包括:
针对任一子队列组,根据所述任一子队列组的消费速度,确定所述任一子队列组当次需要被消费的消息数量N;N为正整数;
根据所述任一子队列组当次需要被消费的消息数量N,生成所述任一子队列组对应的消息调度任务。
7.根据权利要求6所述的方法,其特征在于,所述针对任一子队列组,根据所述任一子队列组的消费速度,确定所述任一子队列组当次需要被消费的消息数量N,包括:
对所述任一子队列组的消费速度进行时间分片,以得到每个时间分片需要消费的消息数量;
确定每个时间分片需要消费的消息数量为当前次需要消费的消息数量N。
8.根据权利要求7所述的方法,其特征在于,所述利用所述第二线程池按照所述消费任务对应的执行周期,周期性地执行每个子队列组对应的消费任务,包括:
利用所述第二线程池以所述时间分片为执行周期,周期性地执行所述任一子队列组对应的消费任务。
9.根据权利要求6所述的方法,其特征在于,所述从所述本地缓存区对应的缓存子队列组中获取所述多个消息调度任务所需的消息,包括:
针对任一消息调度任务对应的子队列组,按照子队列组中的缓存子队列的消费优先级从高到低的顺序,从所述任一消息调度任务对应的子队列组中获取N个消息,作为所述任一消息调度任务对应的子队列组的目标消息。
10.根据权利要求2-9任一项所述的方法,其特征在于,所述将所述目标消息提供给消息消费者,以供所述消息消费者消费所述目标消息,包括:
采用哈希环算法确定所述多个子队列组对应的消息消费者;
将每个子队列组提供的目标消息提供给该子队列组对应的消息消费者,以供每个子队列组对应的消息消费者对该子队列组提供的目标消息进行消费。
11.根据权利要求2-9任一项所述的方法,其特征在于,还包括:
监测所述消息消费者对所述目标消息的消费状态;
若所述消息消费者对所述目标消息的消费状态为消费成功,根据所述目标消息的偏移量,更新本地消费偏移量。
12.根据权利要求11所述的方法,其特征在于,还包括:
若所述消息消费者对所述目标消息的消费状态为消费失败,将所述目标消息重新调度至所述本地缓存区对应的缓存子队列中。
13.一种消息处理系统,其特征在于,包括:存储节点和消息消费节点;
所述存储节点,设置有至少一个消费队列;消费队列用于存储消息;
所述消息消费节点包括:数据拉取层、本地缓存层、消息控制层和消息消费者;所述本地缓存层设置有至少一个缓存队列;
所述数据拉取层,维护有第一线程池,用于根据所述至少一个缓存队列的存储能力,利用第一线程池从所述至少一个消息队列获取消息;并将获取的消息缓存至所述至少一个缓存队列;
所述消费控制层,维护有第二线程池,用于根据所述至少一个缓存队列承载的消费速度,利用所述第二线程池从所述至少一个缓存队列获取消息消费者需要消费的目标消息;并将所述目标消息调度至所述消息消费者;
所述消息消费者用于消费所述目标消息。
14.一种计算设备,其特征在于,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;
所述处理器耦合至所述存储器,用于执行所述计算机程序以用于执行权利要求1-12任一项所述方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111564807.4A CN114490112B (zh) | 2021-12-20 | 2021-12-20 | 消息处理方法、设备及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111564807.4A CN114490112B (zh) | 2021-12-20 | 2021-12-20 | 消息处理方法、设备及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114490112A true CN114490112A (zh) | 2022-05-13 |
CN114490112B CN114490112B (zh) | 2024-09-20 |
Family
ID=81494558
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111564807.4A Active CN114490112B (zh) | 2021-12-20 | 2021-12-20 | 消息处理方法、设备及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114490112B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115460086A (zh) * | 2022-08-18 | 2022-12-09 | 北京永辉科技有限公司 | 分布式中间件的实时防护系统、方法及计算机可读存储介质 |
CN116450324A (zh) * | 2023-06-20 | 2023-07-18 | 北京超星未来科技有限公司 | 任务处理方法、装置、设备及存储介质 |
CN116643870A (zh) * | 2023-07-24 | 2023-08-25 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、系统、装置及可读存储介质 |
CN116795534A (zh) * | 2023-03-31 | 2023-09-22 | 国电南瑞科技股份有限公司 | 基于电力物联网负反馈机制的性能动态调整方法及系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103677844A (zh) * | 2013-12-20 | 2014-03-26 | 国云科技股份有限公司 | 一种基于消息链的轻量级数据处理框架 |
CN107295045A (zh) * | 2016-03-31 | 2017-10-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
CN108345499A (zh) * | 2018-02-01 | 2018-07-31 | 平安科技(深圳)有限公司 | 统一线程池处理方法、应用服务器及计算机可读存储介质 |
CN108595282A (zh) * | 2018-05-02 | 2018-09-28 | 广州市巨硅信息科技有限公司 | 一种高并发消息队列的实现方法 |
US20180302487A1 (en) * | 2017-04-12 | 2018-10-18 | International Business Machines Corporation | Concurrency reduction through publish-subscribe patterns |
CN110213371A (zh) * | 2019-05-31 | 2019-09-06 | 深圳前海微众银行股份有限公司 | 消息消费方法、装置、设备及计算机存储介质 |
CN112181683A (zh) * | 2020-09-27 | 2021-01-05 | 中国银联股份有限公司 | 消息中间件的并发消费方法以及装置 |
CN113296977A (zh) * | 2021-02-24 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
-
2021
- 2021-12-20 CN CN202111564807.4A patent/CN114490112B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103677844A (zh) * | 2013-12-20 | 2014-03-26 | 国云科技股份有限公司 | 一种基于消息链的轻量级数据处理框架 |
CN107295045A (zh) * | 2016-03-31 | 2017-10-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
US20180302487A1 (en) * | 2017-04-12 | 2018-10-18 | International Business Machines Corporation | Concurrency reduction through publish-subscribe patterns |
CN108345499A (zh) * | 2018-02-01 | 2018-07-31 | 平安科技(深圳)有限公司 | 统一线程池处理方法、应用服务器及计算机可读存储介质 |
CN108595282A (zh) * | 2018-05-02 | 2018-09-28 | 广州市巨硅信息科技有限公司 | 一种高并发消息队列的实现方法 |
CN110213371A (zh) * | 2019-05-31 | 2019-09-06 | 深圳前海微众银行股份有限公司 | 消息消费方法、装置、设备及计算机存储介质 |
CN112181683A (zh) * | 2020-09-27 | 2021-01-05 | 中国银联股份有限公司 | 消息中间件的并发消费方法以及装置 |
CN113296977A (zh) * | 2021-02-24 | 2021-08-24 | 阿里巴巴集团控股有限公司 | 一种消息处理方法及装置 |
Non-Patent Citations (2)
Title |
---|
ROBERT STEINKE 等: "A New Pattern for Flexible Worker Threads with In-Place Consumption Message Queues", 《ACM SIGOPS OPERATING SYSTEMS REVIEW》, 1 April 2005 (2005-04-01), pages 71 - 73, XP058118470, DOI: 10.1145/1055218.1055224 * |
蒋暕青 等: "基于队列树的SDN控制器高效消息处理机制", 《电脑知识与技术》, 21 December 2016 (2016-12-21), pages 225 - 227 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115460086A (zh) * | 2022-08-18 | 2022-12-09 | 北京永辉科技有限公司 | 分布式中间件的实时防护系统、方法及计算机可读存储介质 |
CN115460086B (zh) * | 2022-08-18 | 2024-01-30 | 北京永辉科技有限公司 | 分布式中间件的实时防护系统、方法及计算机可读存储介质 |
CN116795534A (zh) * | 2023-03-31 | 2023-09-22 | 国电南瑞科技股份有限公司 | 基于电力物联网负反馈机制的性能动态调整方法及系统 |
CN116450324A (zh) * | 2023-06-20 | 2023-07-18 | 北京超星未来科技有限公司 | 任务处理方法、装置、设备及存储介质 |
CN116643870A (zh) * | 2023-07-24 | 2023-08-25 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、系统、装置及可读存储介质 |
CN116643870B (zh) * | 2023-07-24 | 2023-11-10 | 北方健康医疗大数据科技有限公司 | 一种长时任务分发处理方法、系统、装置及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114490112B (zh) | 2024-09-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114490112B (zh) | 消息处理方法、设备及系统 | |
US11720403B2 (en) | System for commitment-aware workload scheduling based on anticipated resource consumption levels | |
CN103927225B (zh) | 一种多核心架构的互联网信息处理优化方法 | |
CN101452404B (zh) | 一种嵌入式操作系统的任务调度装置及方法 | |
CN104252390B (zh) | 资源调度方法、装置和系统 | |
US11429448B2 (en) | Background job processing framework | |
CN105389206B (zh) | 一种云计算数据中心虚拟机资源快速配置方法 | |
WO2016115000A1 (en) | Hybrid scheduler and power manager | |
CN102915254A (zh) | 任务管理方法及装置 | |
CN107391279B (zh) | 一种消息队列容器创建方法、装置及消息队列容器 | |
CA2928865C (en) | Strict queue ordering in a distributed system | |
CN112087503A (zh) | 集群任务调度方法、系统、计算机和计算机可读存储介质 | |
US8132171B2 (en) | Method of controlling thread access to a synchronization object | |
CN108170758A (zh) | 高并发数据存储方法及计算机可读存储介质 | |
CN111427675A (zh) | 一种数据处理方法、装置以及计算机可读存储介质 | |
CN109408220A (zh) | 一种任务处理方法及装置 | |
CN110011936B (zh) | 基于多核处理器的线程调度方法及装置 | |
JP2016508651A (ja) | コンカレントプライオリティキューにおいてシーケンサを用いるためのシステムおよび方法 | |
US20180191630A1 (en) | Techniques for processor queue management | |
CN108984290A (zh) | 任务调度方法和系统 | |
CN111597044A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
CN113225269A (zh) | 基于容器的工作流调度方法、装置、系统及存储介质 | |
CN111400021A (zh) | 一种深度学习方法、装置及系统 | |
US20170168879A1 (en) | Event Handling in a Cloud Data Center | |
CN109829005A (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 |