一种防止读扩散的消息队列重试方法及其系统技术方案

技术编号:38129669 阅读:17 留言:0更新日期:2023-07-08 09:36
本发明专利技术涉及一种防止读扩散的消息队列重试方法,把单个消费者里的多个复杂任务分成多个子任务,为每个子任务命名,并为每个子任务设定重试类型,使用者发起审批,把消息数据体生产到消息队列中;消费者获得消息队列的数据后并行执行此消费者下的所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,则执行相应的重试操作,本发明专利技术提供的一种防止读扩散的消息队列重试方法,能够保障幂等性,防止读扩散问题的产生。防止读扩散问题的产生。防止读扩散问题的产生。

【技术实现步骤摘要】
一种防止读扩散的消息队列重试方法及其系统


[0001]本专利技术涉及计算机
,特别是一种防止读扩散的消息队列重试方法及其系统。

技术介绍

[0002]消息队列在单据审批系统中的应用可以起到逻辑隔离互不影响的作用,不同的消费者会订阅自己关注的队列,收到队列消息则完成本职任务,一个队列可能会被多个消费者订阅,不同的消费者逻辑隔离互不影响,在某个环节执行失败能够独立地重试,也能保证最终一致性。但随着业务的发展,需求的迭代,原本一个消费者只做一个任务演变成一个消费者要完成多个甚至十几个任务,复杂的消费者逻辑无法做到原子性,所以只能放弃重试功能。如果复杂的消费者拆分成多个消费者,虽然解决了原子性能重试,但会导致读扩散,原本在一个消费者中读取一次数据则可以复用,拆分成多个隔离的消费者后,导致数据读取要扩大到十几次,甚至更多。

技术实现思路

[0003]为克服上述消费者无法保障幂等性、多消费者情况下产生的读扩散问题,本专利技术的目的是提供一种防止读扩散的消息队列重试方法及系统,能够保障幂等性,防止读扩散问题的产生。
[0004]本专利技术采用以下方案实现:
[0005]一种防止读扩散的消息队列重试方法,所述方法步骤如下:
[0006]步骤1:把单个消费者里的多个复杂任务分成多个子任务,对每个子任务进行命名并作为任务名,为每个子任务设定重试类型,每个子任务的重试类型都有不同的最大失败重试次数;
[0007]步骤2:使用者发起审批,将用户编号写入到消息数据体的属性中,把消息数据体生产到消息队列中;
[0008]步骤3:消费者获得消息队列的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,即存在失败的子任务,把失败的子任务的任务名和失败次数写入消息数据体中,并把更新的消息数据体重新写入消息队列,等待重试;
[0009]步骤4:消费者重新获得消息队列消息数据体更新的数据后,判断总失败次数是否大于预设值n,如果大于n则不做处理,否则遍历消息数据体,得到失败的子任务,判断是否超过子任务的最大失败重试次数,如果超过则不再重试子任务;否则根据子任务最大失败重试次数和重试类型,执行重试操作。
[0010]进一步的,步骤1进一步具体为:把单个消费者里的多个复杂任务分成多个子任务,为每个任务命名,并为每个任务设定重试类型,分别为none:不重试,retry:立即重试,即如果失败立即重试,重试次数超过指定子任务最大失败重试次数则放弃,later:延迟重
试,即如果失败则延迟重试,每次延迟时间固定,grads:梯度重试,即每次失败延迟的时间是根据失败次数来决定的,且随次数增加延迟时间增加。
[0011]进一步的,步骤2进一步具体为:使用者发起审批,将用户编号userid写入到消息数据体的data属性中,把消息数据体生产到消息队列pn中,所述消息数据体包括failTotal、data、userid、fail_handlers,所述failTotal为记录所有子任务的失败总次数,所述data为消费者要使用的结构体,所述userid属性为用户编号,所述fail_handlers为失败的子任务数组。
[0012]进一步的,步骤3进一步具体为:消费者获得消息队列pn的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,把失败的子任务的任务名和失败次数写入fail_handlers,失败的子任务的任务名和失败次数即为待重试的数据,并把更新的消息数据体重新写入消息队列pn,等待重试。
[0013]进一步的,步骤4进一步具体为:消费者重新获得消息队列pn的待重试数据后,判断fail_total总失败次数如果大于预设值n则不做处理,否则遍历fail_handlers,得到失败的子任务,判断是否超过子任务的最大失败重试次数,如果超过则不再重试子任务,否则根据子任务最大失败重试次数和重试类型,执行重试操作。
[0014]一种防止读扩散的消息队列重试系统,所述系统包括任务分类模块、消息队列生产模块、任务执行模块、任务重试模块;
[0015]所述任务分类模块用于把单个消费者里的多个复杂任务分成多个子任务,为每个子任务命名作为任务名,并为每个子任务设定重试类型,每个子任务的重试类型都有不同的最大失败重试次数;
[0016]进一步的,所述消息队列生产模块用于使用者发起审批,将用户编号写入到消息数据体的属性中,把消息数据体生产到消息队列中;
[0017]所述任务执行模块用于消费者获得消息队列的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,即存在失败的子任务,把失败的子任务的任务名和失败次数写入消息数据体中,并把更新的消息数据体重新写入消息队列,等待重试;
[0018]所述任务重试模块用于消费者重新获得消息队列消息数据体更新的数据后,判断总失败次数是否大于预设值n,如果大于n则不做处理,否则遍历消息数据体,得到失败的子任务,判断是否超过子任务的最大失败重试次数,如果超过则不再重试子任务;否则根据子任务最大失败重试次数和重试类型,执行重试操作。
[0019]进一步的,任务分类模块进一步具体为:把单个消费者里的多个复杂任务分成多个子任务,为每个任务命名,并为每个任务设定重试类型,分别为none:不重试,retry:立即重试,即如果失败立即重试,重试次数超过指定子任务最大失败重试次数则放弃,later:延迟重试,即如果失败则延迟重试,每次延迟时间固定,grads:梯度重试,即每次失败延迟的时间是根据失败次数来决定的,且随次数增加延迟时间增加。
[0020]进一步的,消息队列生产模块进一步具体为:使用者发起审批,将用户编号userid写入到消息数据体的data属性中,把消息数据体生产到消息队列pn中,所述消息数据体包括failTotal、data、userid、fail_handlers,所述failTotal为记录所有子任务的失败总次
数,所述data为消费者要使用的结构体,所述userid属性为用户编号,所述fail_handlers为失败的子任务数组。
[0021]进一步的,任务执行模块进一步具体为:消费者获得消息队列pn的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,把失败的子任务的任务名和失败次数写入fail_handlers,失败的子任务的任务名和失败次数即为待重试的数据,并把更新的消息数据体重新写入消息队列pn,等待重试。
[0022]进一步的,任务重试模块进一步具体为:消费者重新获得消息队列pn的待重试数据后,判断fail_total总失败次数如果大于预设值n则不做处理,否则遍历fail_handlers,得到失败的子任务,判本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种防止读扩散的消息队列重试方法,其特征在于,所述方法步骤如下:步骤1:把单个消费者里的多个复杂任务分成多个子任务,对每个子任务进行命名并作为任务名,为每个子任务设定重试类型,每个子任务的重试类型都有不同的最大失败重试次数;步骤2:使用者发起审批,将用户编号写入到消息数据体的属性中,把消息数据体生产到消息队列中;步骤3:消费者获得消息队列的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,即存在失败的子任务,把失败的子任务的任务名和失败次数写入消息数据体中,并把更新的消息数据体重新写入消息队列,等待重试;步骤4:消费者重新获得消息队列消息数据体更新的数据后,判断总失败次数是否大于预设值n,如果大于n则不做处理,否则遍历消息数据体,得到失败的子任务,判断是否超过子任务的最大失败重试次数,如果超过则不再重试子任务;否则根据子任务最大失败重试次数和重试类型,执行重试操作。2.根据权利要求1所述的一种防止读扩散的消息队列重试方法,其特征在于,步骤1进一步具体为:把单个消费者里的多个复杂任务分成多个子任务,为每个任务命名,并为每个任务设定重试类型,分别为none:不重试,retry:立即重试,即如果失败立即重试,重试次数超过指定子任务最大失败重试次数则放弃,later:延迟重试,即如果失败则延迟重试,每次延迟时间固定,grads:梯度重试,即每次失败延迟的时间是根据失败次数来决定的,且随次数增加延迟时间增加。3.根据权利要求1所述的一种防止读扩散的消息队列重试方法,其特征在于,步骤2进一步具体为:使用者发起审批,将用户编号userid写入到消息数据体的data属性中,把消息数据体生产到消息队列pn中,所述消息数据体包括failTotal、data、userid、fail_handlers,所述failTotal为记录所有子任务的失败总次数,所述data为消费者要使用的结构体,所述userid属性为用户编号,所述fail_handlers为失败的子任务数组。4.根据权利要求3所述的一种防止读扩散的消息队列重试方法,其特征在于,步骤3进一步具体为:消费者获得消息队列pn的数据后并行执行所有子任务,所有子任务执行成功则发送消息到下一个消息队列中,以供下一个审批步骤的消费者使用;如果有子任务执行失败,把失败的子任务的任务名和失败次数写入fail_handlers,失败的子任务的任务名和失败次数即为待重试的数据,并把更新的消息数据体重新写入消息队列pn,等待重试。5.根据权利要求4所述的一种防止读扩散的消息队列重试方法,其特征在于,步骤4进一步具体为:消费者重新获得消息队列pn的待重试数据后,判断fail_total总失败次数如果大于预设值n则不做处理,否则遍历fail_handlers,得到失败的子任务,判断是否超过子任务的最大失败重试次数,如果超过则不再重试子任务,否则根据子任务最大失败重试次数和重试类型,执行重试操作。6.一种防止读扩散的消息队列重试系统,其特征在于,所述系统包括任务分类模块、消息队...

【专利技术属性】
技术研发人员:刘德建叶伟李佳
申请(专利权)人:福建天晴数码有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1