发明内容
本公开的目的至少部分地在于提供一种向消息队列(MQ)中的消息分配消费端系统中的消费节点的装置及方法,能够高效及时地进行资源分配以使得改善系统资源利用。
根据本公开的一个方面,提供了一种向消息队列(MQ)中的消息分配消费端系统中的消费节点的装置,包括:监控子系统,配置为:监控MQ中各类消息的积存度量以及消费端系统中各消费节点的处理压力度量;及当某一类消息的积存度量超过第一阈值时,为该类消息分配一新的消费节点;和/或当某一消费节点的处理压力度量超过第二阈值时,为该消费节点中积存度量最大的一类消息分配一新的消费节点;以及分配子系统,配置为根据监控子系统的分配结果,更新各消费节点的订阅信息。
根据实施例,MQ中一类消息的积存度量可以按消费该类消息的各消费节点在单位时间段内消费该类消息的平均数量来计算。类似地,某一消费节点的处理压力度量可以按该消费节点在单位时间段内消费的所有消息的数目来计算。
监控子系统可以被配置为:i)判断各类消息的积存度量是否超过第一阈值,如果均未超过第一阈值,则进行下述操作iii),或者如果某一类消息的积存度量超过第一阈值,则对该类消息进行资源预分配操作,所述资源预分配操作包括:查找当前并不消费该类消息的消费节点中处理压力度量最小的消费节点,假设从当前消费该类消息的各消费节点所消费的该类消息中分出一定数量由所查找的消费节点来处理;ii)基于资源预分配操作的结果,重新计算各类消息的积存度量以及各消费节点的处理压力度量;iii)如果某一消费节点的处理压力度量或者通过ii)中的操作重新计算的处理压力度量超过第二阈值,则针对该消费节点中积存度量最大的一类消息,进行上述资源预分配操作;以及iv)重复ii)和iii)的处理,直至各消费节点所分配的各类消息的数目收敛,其中,对于各类消息,向该类消息分配收敛结果中对该类消息的处理数量不为零的消费节点。
分配子系统可以被配置为:针对各消费节点,判断该消费节点是否被分配了新的一类消息,并且如果被分配了新的一类消息,则更新该消费节点的订阅信息。例如,分配子系统可以被配置为按预定的同步时刻,来进行所述判断和更新的操作。更新可以包括:通过MQ的应用编程接口“API”对消费节点上的MQconsumerListener的监听者信息进行更新,其中每一监听者负责监听一类信息。
根据本公开的另一方面,提供了一种向消息队列(MQ)中的消息分配消费端系统中的消费节点的方法,该方法包括:监控MQ中各类消息的积存度量以及消费端系统中各消费节点的处理压力度量;当某一类消息的积存度量超过第一阈值时,为该类消息分配一新的消费节点;和/或当某一消费节点的处理压力度量超过第二阈值时,为该消费节点中积存度量最大的一类消息分配一新的消费节点;以及根据监控子系统的分配结果,更新各消费节点的订阅信息。
根据实施例,可以基于各消费节点对MQ中各类消息的消费频率,来确定消息的积存度量以及消费节点的处理压力度量,其中一消费节点cj对一类消息mi的消费频率αij定义为N/t,其中N是该消费节点cj在预定时间段t内消费的该类消息mi的数目。
例如,可以根据以下公式确定一类消息mi的积存度量λi:
其中,n是消费端系统中部署的消费节点的数目,j是消费节点的索引且1≤j≤n,mcij表示消费节点cj是否处理该类消息mi,其中当消费节点cj处理该类消息mi时mcij=1,否则mcij=0。
例如,可以根据以下公式确定消费节点cj的处理压力度量βj:
其中,k是消费端系统所订阅的MQ中消息的种类数,i是各类消息的索引且1≤i≤k。
分配操作可以包括:
i)判断各类消息的积存度量是否超过第一阈值,如果均未超过第一阈值,则进行下述操作iii),或者如果一类消息mi的积存度量λi超过第一阈值,则对该类消息mi进行资源预分配操作,所述资源预分配操作包括:查找当前并不消费该类消息mi的消费节点中处理压力度量最小的消费节点cj,并进行如下变换:
其中,n是消费端系统中部署的消费节点的数目,j是消费节点的索引且1≤j≤n,k是消费端系统所订阅的MQ中消息的种类数,i是各类消息的索引且1≤i≤k, 当且仅当mci′j′≠0,mcij表示消费节点cj是否处理该类消息mi,其中当消费节点cj处理该类消息mi时mcij=1,否则mcij=0;
ii)基于变换后的αij,重新计算各类消息的积存度量以及各消费节点的处理压力度量;
iii)如果某一消费节点cj的处理压力度量或者通过ii)中的操作重新计算的处理压力度量超过第二阈值,则针对该消费节点cj中积存度量最大的一类消息mi,进行上述变换;
iv)重复ii)和iii)的处理,直至各αij收敛;以及
v)基于收敛的Ak×n,得到MCk×n=[mcij]k×n:
其中,mcij=1当且仅当αij>0,mcij=0当且仅当αij=0。
根据本公开的实施例,可以在MQ消息生成量以及消费节点处理能力不断变化的情况下,抑制MQ消息的积压,降低消息到达时间,减少系统运维成本,并提高资源利用率。
具体实施方式
以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。
在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。这里使用的词语“一”、“一个(种)”和“该”等也应包括“多个”、“多种”的意思,除非上下文另外明确指出。此外,在此使用的术语“包括”、“包含”等表明了所述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。
在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。
附图中示出了一些方框图和/或流程图。应理解,方框图和/或流程图中的一些方框或其组合可以由计算机程序指令来实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,从而这些指令在由该处理器执行时可以创建用于实现这些方框图和/或流程图中所说明的功能/操作的装置。
因此,本公开的技术可以硬件和/或软件(包括固件、微代码等)的形式来实现。另外,本公开的技术可以采取存储有指令的计算机可读介质上的计算机程序产品的形式,该计算机程序产品可供指令执行系统使用或者结合指令执行系统使用。在本公开的上下文中,计算机可读介质可以是能够包含、存储、传送、传播或传输指令的任意介质。例如,计算机可读介质可以包括但不限于电、磁、光、电磁、红外或半导体系统、装置、器件或传播介质。计算机可读介质的具体示例包括:磁存储装置,如磁带或硬盘(HDD);光存储装置,如光盘(CD-ROM);存储器,如随机存取存储器(RAM)或闪存;和/或有线/无线通信链路。
图2示出了根据本公开实施例的消息系统的方框图。
如图2所示,与图1所示的消息系统类似,根据该实施例的消息系统200包括消息采集系统(生产端)2001、消息队列(MQ)消息中间件服务平台2003以及消息处理系统(消费端)2005。进一步,称一种类型消息的生产者为生产节点(producer),如2011所示;一种类型消息的处理者为消费节点(consumer),如2051所示;消息用M表示,如2031所示。根据本公开的实施例,MQ消息中间件服务平台2003可以具有按消息类型垂直划分的发布订阅管理功能,并可支持多组MQ消费服务器的负载均衡。
此外,消息系统200还包括用于向MQ中的消息2031分配消费端系统2005中的消费节点2051的装置2007。在此,该装置2007可以基于反馈机制来进行自动分配。该装置2007可以包括监控子系统2071和分配子系统2073。监控子系统2071可以负责MQ消息2031以及消费节点2051的监控体系,分配子系统2073可以根据监控子系统2071的监控结果来调整各消息2031的消费节点处理数。以下,将分别对监控子系统2071和分配子系统2073进行详细描述。
设定
在具体描述之前,首先说明一些基本设定。
在此,设定消费端系统2005的计算资源能够满足所订阅MQ消息的处理。也即,当出现消息积压等问题时,可能是由于计算资源分配不合理而造成的。
此外,在实际生产环境中,由于MQ消息的生产端系统2001和消费端系统2005是分布在不同的网络中,并且MQ消息的具体来源对消费端系统2005具有透明的特点。换而言之,消费端系统2005只需要根据业务需求到MQ消息中间件服务平台2003进行相应的订阅。在实际应用系统中,一个生产节点2011可生产多种类型的消息,一个消费节点2051也可以消费处理多种类型的消息。在此假设:消费端系统2005订阅了k类MQ消息,用向量为M=(m1,m2,...mk)表示;部署了n个消费消费节点计算资源,用向量C=(c1,c2,...cn)表示;并用矩阵MC表示MQ消息与消费节点之间计算资源分配关系,MC简称资源矩阵:
其中,元素mcij表示消费节点cj(1≤j≤n)是否处理消息mi(1≤i≤k),若处理,则mcij为1,否则为0。
监控子系统
根据本公开的实施例,监控子系统2071可以监控MQ中各类消息的积存度量以及消费端系统中各消费节点的处理压力度量。
由于消费端系统2005与MQ消息中间件服务平台2003处于异构网络中,消费端系统2005只有通过客户端MQ中间件平台2003建立连接,才能接收到MQ推送的消息。由于MQ消息模式限制以及性能限制,目前MQ客户端不支持直接获取消息队列中的消息积存数量。因此,根据本公开的实施例,监控子系统2071可以基于消费一类消息的各消费节点在单位时间段内消费该类消息的平均数量来计算该类消息的积存度量,和/或基于一消费节点在单位时间段内消费的所有消息的数目来计算该消费节点的处理压力度量。
具体地,根据本公开的实施例,监控子系统2071可以采用通过监控消费节点的消费频率来达到监控各消费节点处理压力的目的。在此,一消费节点cj对一类消息mi的消费频率αij可以定义为N/t,其中N是该消费节点cj在预定时间段t内消费的该类消息mi的数目。αij表示消息mi对消费节点cj造成的压力值。
消费端系统2005的处理压力可以用矩阵A表示,简称压力矩阵:
如果资源矩阵MC中的元素mcij为0,则在压力矩阵A中,相应的压力值αij也为0,因为mcij=0表示消费节点cj并未订阅消息mi,即在预定时间段t内消费的该类消息mi的数目为0。
消费节点订阅处理的消息种类越多,该消费节点的处理压力越大。因此,消费节点cj处总的处理压力值或处理压力度量可以表示为:
由于一种MQ消息可以由多个消费节点进行消费,并且消息中间件服务平台的负载均衡确保了消费节点的处理压力值相差不多。于是,该消息对应的各消费节点的平均处理压力直接反应了该消息的积压情况。因此,对于一类消息mi,其积存值或积存度量λi可以表示为:
根据本公开的实施例,采用两种原则来调整MQ消息的消费节点资源。具体地,一方面,当MQ消息mi在其现有的分配消费节点资源mci=(mci1,mci2,...mcin)下,其积存值超过某一阈值时,表明消费节点计算资源不足,需要重新调整计算处理资源。另一方面,当消费节点cj压力值超过某一阈值时,则表明需要对节点cj的现有MQ消息进行计算资源重分配。上面两种情况就是本文需要调整MQ消息的消费节点资源的两种调控原则。
根据这两个原则,当某一类消息mi的积存度量λi超过阈值(称为“第一阈值”)时,可以为该类消息mi分配一新的消费节点;和/或,当某一消费节点cj的处理压力度量βj超过阈值(称为第二阈值)时,可以为该消费节点cj中积存度量最大的一类消息分配一新的消费节点。
图3示出了根据本公开实施例的监控子系统进行资源分配的流程图。
如图3所示,在操作301,监控子系统2003可以根据以上计算得到的积存度量λi和处理压力度量βj,查找超过积存阈值的消息mi。如不存在(即,“否”),则操作进行到307;否则,操作进行到303,对消息mi进行资源预分配操作。
根据本公开的实施例,资源预分配操作可以包括:查找当前并不消费该类消息的消费节点中处理压力度量最小的消费节点,假设从当前消费该类消息的各消费节点所消费的该类消息中分出一定数量由所查找的消费节点来处理。
具体地,可以查找没有被消息mi分配的消费节点中处理压力值最小的消费节点cj作为预分配资源,并对处理压力矩阵A作如下变换:
其中, 当且仅当mci′j′≠0。
在该示例中,将δ设为原积存值λi/(当前订阅消息mi的节点数+1),但是本公开不限于此,可以按其他方式设定δ。
之后,在操作305,可以基于资源预分配操作的结果(例如,体现为变化后的处理压力矩阵A),重新计算各类消息的积存度量以及各消费节点的处理压力度量。
接着,在操作307,可以查找超过处理压力阈值的消费节点cj。若存在(即,“是”),则可以查找节点cj中积存值最大的消息mi,且操作进行到303,针对该类消息mi执行资源预分配操作(例如,如上所述变化压力矩阵);否则,操作进行到309,以得到收敛的最终资源分配结果。
具体地,可以进行如下处理获得MQ消息的资源矩阵MC:
其中,mcij=1当且仅当αij>0,mcij=0当且仅当αij=0。
根据本公开的原理,压力矩阵A最多经过k(n-1)次矩阵变换即可得到一个变换收敛值。这是因为如上所述设定消费端系统现有的消费节点计算资源能够满足订阅的各种MQ消息处理,因为每种消息最多经过(n-1)次压力矩阵变换处理,即可分配完所有的消费节点。
这样,监控子系统2071获得了新的资源分配方案(体现为得到的新资源矩阵MC),其中可能向某一类消息mi新分配了一个或多个消费节点。
当然,如果最终不能收敛(例如,经过预定次数的资源预分配操作或者说压力矩阵变换之后,例如由于消费端系统现有的消费节点事实上并不能满足消息处理的需求),则可以返回错误,以告知系统管理员。
监控子系统2071可以实时或者按预定的定时持续进行监控操作。
分配子系统
根据监控子系统2071获得的新资源分配方案,分配子系统2073可以自动更新各消费节点的订阅信息。
图4示出了根据本公开实施例的分配子系统更新消费节点订阅信息的流程图。
如图4所示,分配子系统2073可以按预定的同步时刻,来进行这种更新操作。具体地,在操作401,可以判断是否达到同步时刻。如果尚未到达(即,“否”),则分配子系统2073可以继续等待同步时刻的到达;否则(即,“是”),则分配子系统2073可以从监控子系统2071获得新的资源分配方案(例如,资源矩阵MC)。
然后,在操作403,分配子系统2073可以判断获得的新资源分配方案是否与前次资源分配方案相同。具体地,分配子系统2073可以判断获得的新资源矩阵MC与当前使用的资源矩阵MC是否相同(即,判断MC中各元素是否相同,也就是说,判断某一消费节点是否被分配了新的一类消息)。
如果资源分配方案未发生变化,则操作返回401,继续等待下次同步时刻的到来。如果资源分配方案发生了变化,则操作进行到407,分配子系统2073可以根据新的资源分配方案(即,新的资源矩阵MC),来更新节点的订阅信息。具体地,如果一消费节点被分配了新的一类消息,则可以更新该消费节点的订阅信息。例如,可以通过MQ的应用编程接口(API)对消费节点上的MQconsumerListener的监听者信息进行更新,其中每一监听者负责监听一类信息。
本案中的同步工具可以是一个循环线程,也可以是一个定时worker工具,该同步工具最重要的特征是要具有循环定时执行任务的功能。
在现有多消息处理的应用系统中,当出现MQ消息积压时,大部分采取人工干预措施,不但增加了系统运维成本,导致系统服务器资源的浪费,并且从根本上无法解决MQ消息的积压问题。在此提出的基于反馈机制的MQ消息处理节点的自动化分配的技术方案通过实时监控各消费节点的MQ消息处理以及服务器计算资源利用情况,采用本文提出变换调控处理策略计算各MQ消息的计算资源分配矩阵,然后通过调控-反馈系统中的同步工具,将最新分配的MQ消息进行注册监听消费。在本方案中提出的两阶段变换调控处理策略能够快速有效的获取最新的MQ消息的资源分配信息,本策略既考虑了消费节点的处理能力,也考虑到各MQ消息的积存情况,有效地提高了服务器计算资源的利用率,也大大提高了消息的处理效率,进而提高了消息的及时到达率。另一方面,本文提出的动态分配方案能够有效地降低人工运维成本,并避免了因消费处理系统不断重新发布带来的时间成本。
以上对本公开的实施例进行了描述。但是,这些实施例仅仅是为了说明的目的,而并非为了限制本公开的范围。尽管在以上分别描述了各实施例,但是这并不意味着各个实施例中的措施不能有利地结合使用。本公开的范围由所附权利要求及其等价物限定。不脱离本公开的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本公开的范围之内。