掌桥专利:专业的专利平台
掌桥专利
首页

一种微服务线程队列堆积处理方法

文献发布时间:2023-06-19 18:29:06


一种微服务线程队列堆积处理方法

技术领域

本发明涉及微服务领域,特别涉及一种微服务线程队列堆积处理方法。

背景技术

微服务与单一应用不同,服务之间通过消息机制互相调用,每个服务处理消息的能力有限,服务提供方一般会把收到的消息先放到队列中,然后多个线程来拉取消息进行处理。

若服务调用方的消息生产速率持续快于服务提供方的消息消费速率,则会产生队列堆积。服务调用方因此会大量超时,得不到消息提供方的响应,若服务调用方又由其他的调用方所调用依赖,会发生连锁反应,导致微服务系统中大量的服务异常。

基于此,本发明公开了一种微服务线程队列堆积处理方法,能识别队列发生了堆积,并能快速移除堆积从而恢复队列的处理能力,同时定位到发生故障的消息。

发明内容

本发明要解决的技术问题是克服现有技术的缺陷,提供一种微服务线程队列堆积处理方法。

本发明提供了如下的技术方案:

本发明提供一种微服务线程队列堆积处理方法,包括以下步骤:

S1、建立微服务线程队列模型:

每一个微服务内部建立一个接收队列,该队列为有界队列,长度为a,a≥10000,启动b个消费者线程,b≥100,b个消费者线程公平的消费队列中的消息;

S2、队列模型分配时间标志和汇总处理情况:

(a)服务调用方调用服务提供方的消息发送方法:

具体为所发送的消息报文必须附带以下2个关键字段:timeout和msgType;

(a1)等待响应超时时间timeout,该字段表示服务调用方在等待timeout秒后,未收到响应,则认为超时,不再继续等待;

(a2)消息类型msgType,表示服务提供方惟一的消息类型,如手机号登录、发送登录短信等,服务提供者的消息类型集合记作Q;

(b)服务提供方接收消息入队方法:

在服务提供方接收到服务调用方的请求报文后,从报文中获得timeout和msgType,并记录接收到报文请求的时间为入队时间enQueueTime,把请求内容,enQueueTime,timeout和msgType作为一个数据元素放入队列;

(c)服务提供方到达次数周期汇总方法:

对每个msgType每分钟到达情况做一次到达汇总计算,计算消息类型的到达次数;

具体为,服务提供方接收到请求后,对每一个请求的msgType,累计1分钟内的msgType的个数,求得到达次数arriveCount,t时刻msgType为m的到达次数记作g(m,t),同理t-1时刻msgType为m的到达次数记作g(m,t-1);

(d)服务提供方消费者数据元素出队方法,服务提供方有b个消费者线程,若队列不为空,某个消费者线程从队列中出队一个数据元素;

(e)服务提供方对该数据元素的业务处理方法:

(e1)某一数据元素出队后,记录当前时间作为该请求出队时间outQueueTime;

(e2)对该数据元素中的消息内容进行业务处理,其处理时间记为handleTime;

(f)服务提供方对处理效率的周期汇总方法:

对每个msgType每分钟处理情况做一次汇总计算,求平均处理时间avgHandleTime;公式如下:

avgHandleTime(msgType)=handleTime(msgType)/count(msgType);

count(msgType)为1分钟内的处理的相同msgType的数据元素个数;

ΣhandleTime(msgType)为1分钟内的处理的相同msgType的数据元素的总处理时间之和,求得平均处理时间avgHandleTime(msgType);

t时刻msgType为m的平均处理时间avgHandleTime(msgType,t)简化记作f(m,t);

同理,t-1时刻msgType为m的平均处理时间简化记作f(m,t-1);

S3、检测队列堆积的方法:

若发生下面2种情况,判定队列堆积:

(1)服务提供方接收到新消息,但此时队列长度已达a,则无法继续入队,因队列满队列堆积,此时丢弃该请求,记下首次堆积时刻为r,此时上个时刻未堆积,若上个时刻已堆积,则已在上个时刻检测到;

(2)从队列中出队后,计算outQueueTime,检查outQueueTime-enQueueTime>timeout,则因此请求调用方已不再等待其响应结果,没有必要继续处理,所以丢弃该请求;若连续累计有c条请求都需要丢弃,则判定队列已堆积,记下首次堆积时刻为r,此时上个时刻未堆积,若上个时刻已堆积,则已在上个时刻检测到;

S4、队列堆积的恢复方法:

因服务提供方消息太多或处理速度低于服务调用方的发放速度,而服务调用方感知到超时后,又会不停重发请求给服务提供方;若不能及时恢复队列,则会发生链式传导,最终系统各服务均发生风险;具体恢复方法为:

(1)系统恢复,历史消息调用方已不再等待,没有必要处理失效的消息,先清空队列中的所有消息进行系统恢复;

(2)自动扩容,增加服务提供方的消费能力,具体可为:检测若cpu<30%,则线程数增大100%,若30%

S5、队列堆积的溯源方法:

在队列堆积的情况下,需找到哪些消息导致的堆积;具体方法为:

(1)对平均处理时间太长的消息类型溯源;

对于所有的消息类型msgType,m∈Q,若f(m,r)>α*f(m,r-1),则m放入集合E,E为处理时间长的堆积消息类型集合,α≥2,α为预设阈值;

(2)对到达速率太快的消息类型溯源;

对于所有的消息类型msgType,m∈Q,若g(m,r)>α*g(m,r-1),则m放入集合H,H为到达速率太快的堆积消息类型集合,β≥2,β为预设阈值;

最终在堆积时刻r,找到导致堆积的消息类型集合E和H。

与现有技术相比,本发明的有益效果如下:

本发明提供了一种微服务线程队列堆积处理方法解决微服务中线程队列堆积识别困难、难以快速恢复以及难以准确溯源到导致问题的消息类型的问题。该方法通过对队列的出队和入队时间以及消息输入速度进行统计汇总,能够精准定位到当时发生问题的消息类型,提高问题排查效率,与现有的技术方法对比,能快速恢复队列并自动定位问题;

综上,本发明能够解决微服务系统中线程队列堆积问题,同时可自动的对微服务进行恢复,提升了微服务的可用性,并自动定位到问题消息,简化了当前微服务群复杂的治理工。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:

图1是本发明的流程图。

具体实施方式

以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。其中附图中相同的标号全部指的是相同的部件。

实施例1

如图1,本发明提供一种微服务线程队列堆积处理方法,包括以下步骤:

S1、建立微服务线程队列模型:

每一个微服务内部建立一个接收队列,该队列为有界队列,长度为a,a≥10000,启动b个消费者线程,b≥100,b个消费者线程公平的消费队列中的消息;

S2、队列模型分配时间标志和汇总处理情况:

(a)服务调用方调用服务提供方的消息发送方法:

具体为所发送的消息报文必须附带以下2个关键字段:timeout和msgType;

(a1)等待响应超时时间timeout,该字段表示服务调用方在等待timeout秒后,未收到响应,则认为超时,不再继续等待;

(a2)消息类型msgType,表示服务提供方惟一的消息类型,如手机号登录、发送登录短信等,服务提供者的消息类型集合记作Q;

(b)服务提供方接收消息入队方法:

在服务提供方接收到服务调用方的请求报文后,从报文中获得timeout和msgType,并记录接收到报文请求的时间为入队时间enQueueTime,把请求内容,enQueueTime,timeout和msgType作为一个数据元素放入队列;

(c)服务提供方到达次数周期汇总方法:

对每个msgType每分钟到达情况做一次到达汇总计算,计算消息类型的到达次数;

具体为,服务提供方接收到请求后,对每一个请求的msgType,累计1分钟内的msgType的个数,求得到达次数arriveCount,t时刻msgType为m的到达次数记作g(m,t),同理t-1时刻msgType为m的到达次数记作g(m,t-1);

(d)服务提供方消费者数据元素出队方法,服务提供方有b个消费者线程,若队列不为空,某个消费者线程从队列中出队一个数据元素;

(e)服务提供方对该数据元素的业务处理方法:

(e1)某一数据元素出队后,记录当前时间作为该请求出队时间outQueueTime;

(e2)对该数据元素中的消息内容进行业务处理,其处理时间记为handleTime;

(f)服务提供方对处理效率的周期汇总方法:

对每个msgType每分钟处理情况做一次汇总计算,求平均处理时间avgHandleTime;公式如下:

avgHandleTime(msgType)=handleTime(msgType)/count(msgType);

count(msgType)为1分钟内的处理的相同msgType的数据元素个数;

ΣhandleTime(msgType)为1分钟内的处理的相同msgType的数据元素的总处理时间之和,求得平均处理时间avgHandleTime(msgType);

t时刻msgType为m的平均处理时间avgHandleTime(msgType,t)简化记作f(m,t);

同理,t-1时刻msgType为m的平均处理时间简化记作f(m,t-1);

S3、检测队列堆积的方法:

若发生下面2种情况,判定队列堆积:

(1)服务提供方接收到新消息,但此时队列长度已达a,则无法继续入队,因队列满队列堆积,此时丢弃该请求,记下首次堆积时刻为r,此时上个时刻未堆积,若上个时刻已堆积,则已在上个时刻检测到;

(2)从队列中出队后,计算outQueueTime,检查outQueueTime-enQueueTime>timeout,则因此请求调用方已不再等待其响应结果,没有必要继续处理,所以丢弃该请求;若连续累计有c条请求都需要丢弃,则判定队列已堆积,记下首次堆积时刻为r,此时上个时刻未堆积,若上个时刻已堆积,则已在上个时刻检测到;

S4、队列堆积的恢复方法:

因服务提供方消息太多或处理速度低于服务调用方的发放速度,而服务调用方感知到超时后,又会不停重发请求给服务提供方;若不能及时恢复队列,则会发生链式传导,最终系统各服务均发生风险;具体恢复方法为:

(1)系统恢复,历史消息调用方已不再等待,没有必要处理失效的消息,先清空队列中的所有消息进行系统恢复;

(2)自动扩容,增加服务提供方的消费能力,具体可为:检测若cpu<30%,则线程数增大100%,若30%

S5、队列堆积的溯源方法:

在队列堆积的情况下,需找到哪些消息导致的堆积;具体方法为:

(1)对平均处理时间太长的消息类型溯源;

对于所有的消息类型msgType,m∈Q,若f(m,r)>α*f(m,r-1),则m放入集合E,E为处理时间长的堆积消息类型集合,α≥2,α为预设阈值;

(2)对到达速率太快的消息类型溯源;

对于所有的消息类型msgType,m∈Q,若g(m,r)>α*g(m,r-1),则m放入集合H,H为到达速率太快的堆积消息类型集合,β≥2,β为预设阈值;

最终在堆积时刻r,找到导致堆积的消息类型集合E和H。

本发明提供了一种微服务线程队列堆积处理方法解决微服务中线程队列堆积识别困难、难以快速恢复以及难以准确溯源到导致问题的消息类型的问题。该方法通过对队列的出队和入队时间以及消息输入速度进行统计汇总,能够精准定位到当时发生问题的消息类型,提高问题排查效率,与现有的技术方法对比,能快速恢复队列并自动定位问题;

综上,本发明能够解决微服务系统中线程队列堆积问题,同时可自动的对微服务进行恢复,提升了微服务的可用性,并自动定位到问题消息,简化了当前微服务群复杂的治理工作。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种任务执行线程的处理方法、装置、设备及存储介质
  • 一种基于多线程的分布式数据处理方法及服务器
  • 一种基于多线程编程及消息队列的多线程并行处理方法
  • 一种基于多线程编程及消息队列的多线程并行处理方法
技术分类

06120115582614