基于RabbitMQ死信队列的任务处理方法和系统技术方案

技术编号:36956641 阅读:55 留言:0更新日期:2023-03-22 19:17
本发明专利技术提供一种基于RabbitMQ死信队列的任务处理方法和系统,其中方法保留RabbitMQ原有延迟队列特性的同时,使用自定义请求头消息拒绝策略结合自定义执行策略校验,使得消息队列的消息执行可以突破原生消息TTL及死信队列的局限性,可根据实际生产开发需要灵活定制合适的消息补偿策略,不仅有效减少业务系统间短时间内非必要的频繁交互,还能显著分散大批量消息执行所带来的系统压力,并且本发明专利技术仅需两个队列即可完成消息流转,相较于需要多个不同TTL死信队列的方案更加简洁精炼;另外适配消息队列的消息最终销毁确认功能,清除补偿总耗时过长的消息队列的消息,节省RabbitMQ内存空间,避免死信队列消息积压。避免死信队列消息积压。避免死信队列消息积压。

【技术实现步骤摘要】
基于RabbitMQ死信队列的任务处理方法和系统


[0001]本专利技术属于消息处理
,尤其涉及一种基于RabbitMQ死信队列的任务处理方法和系统。

技术介绍

[0002]RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息。在软件日常开发过程中,会遇到一种场景,当消息处理在消费端系统遇到异常场景返回队列中时,消费端会立即再次获取处理,若此时异常情况未得到解决,就会产生无休止的消息交互,给消费端系统带来极大的负载压力及资源消耗。例如,提现成功后需要发送短信或通知提醒到用户,若正巧运营商升级暂时无法提供服务,系统则持续不断尝试访问运营商,直至运营商系统恢复为止。
[0003]虽然RabbitMQ自身有提供消息过期和死信机制,但两种方式都有局限性。消息过期仅对队列中的首条消息有效;死信队列仅能在队列上设置固定存活时间,基于以上传统方式实现的延迟队列机制则也只能按固定时间差进行消息补偿,缺乏灵活度,且队列消息数据量庞大时,在队列TTL到期的瞬间仍会给消费端系统带来压力。

技术实现思路

[0004]本专利技术针对现有技术中的不足,提供一种基于RabbitMQ死信队列的任务处理方法和系统。
[0005]第一方面,本专利技术提供一种基于RabbitMQ死信队列的任务处理方法,包括:
[0006]S1,创建业务队列normal_queue;配置业务队列的参数x

dead

letter

exchange和x

dead

letter

routing

key指向死信队列;
[0007]S2,创建死信队列normal_queue_retry;配置死信队列的参数x

dead

letter

exchange和x

dead

letter

routing

key指向业务队列;
[0008]S3,配置死信队列的参数x

message

ttl设置补偿消息在死信队列中的存活时间;
[0009]S4,当业务队列处理消息时,对消息报文头自定义属性retry

times补偿次数进行判断校验;
[0010]S5,如果存在retry

times属性,则消息为补偿消息并根据阶梯策略判断补偿消息是否到达执行补偿的时间;
[0011]S6,如果补偿消息已到达最大补偿次数,则直接删除消息;
[0012]S7,如果补偿消息已到补偿时间,则进行S10的操作;
[0013]S8,如果补偿消息未到补偿时间,则将消息再返回死信队列中等待下次轮询并进行S13的操作;
[0014]S9,如果不存在retry

times属性,则消息为正常消息并进行S10的操作;
[0015]S10,判断消息正常处理是否成功;
[0016]S11,如果否,则复制当前消息报文并在消息头中添加自定义属性msg

timestamp
为当前时间的时间戳,并将消息发送至死信队列;
[0017]S12,如果是,则正常确认并删除消息;
[0018]S13,消息在延迟队列到期后通过死信队列的交换机转发至与消息携带的路由键相匹配的业务队列中,以供消费者尝试消费并返回执行S4的操作。
[0019]进一步地,所述配置死信队列的参数x

message

ttl设置补偿消息在死信队列中的存活时间,包括:
[0020]在消息本身的存活时间大于消息所在队列的存活时间的情况下,消息本身的存活时间取决于其所在队列的存活时间;
[0021]在消息本身的存活时间小于消息所在队列的存活时间的情况下,消息满足本身的存活时间后变为死信。
[0022]进一步地,在消息消费异常需要补偿时,采用由消费者自定义消息重新推送消息的方式:使用当前消息队列的消息报文体,创建一条带有自定义消息头的消息;自定义消息头包含字段retry

times和msg

timestamp,最终组合后由消费者主动推送至延迟队列,最后调用basicAck把当前消息队列的消息确认消费,从消息队列中抹除。
[0023]进一步地,如果消息头中无自定义字段,代表是首次进入拒绝策略,则retry

times设置初始值1;如果消息头中存在自定义字段,则获取retry

times当前值+1并重新赋值。
[0024]进一步地,针对消息执行策略,在消费者获取到消息队列的消息准备业务执行前,增加消费前置校验:校验当前消息队列的消息是否为补偿消息且已达到预期的执行时间;
[0025]获取消息队列的消息报文头,如果消息报文头中含有自定义字段retry

times,代表当前消息队列的消息是补偿消息;
[0026]根据补偿次数及创建时间戳进行补偿业务流程。
[0027]进一步地,所述根据补偿次数及创建时间戳进行补偿业务流程,包括:
[0028]在消息头中无自定义字段的情况下,代表非补偿消息,跳过执行策略验证;
[0029]在消息头中存在自定义字段的情况下,获取retry

times并计算出当前补偿次数对应所需的间隔时间;
[0030]结合当前时间判断是否满足间隔时间要求,
[0031]如果是,则开始执行消息处理流程;
[0032]如果否,则调用原生basicNack拒绝消息发送至延迟队列,等待下次执行校验;
[0033]在消息头中存在自定义字段,且retry

times值大于预设基数的情况下,代表消息补偿总耗时已超出预期,选择销毁补偿总耗时超出预期的消息。
[0034]第二方面,本专利技术提供一种基于RabbitMQ死信队列的任务处理系统,包括:
[0035]业务队列创建模块,用于创建业务队列normal_queue;配置业务队列的参数x

dead

letter

exchange和x

dead

letter

routing

key指向死信队列;
[0036]死信队列创建模块,用于创建死信队列normal_queue_retry;配置死信队列的参数x

dead

letter

exchange和x

dead
‑<本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于RabbitMQ死信队列的任务处理方法,其特征在于,包括:S1,创建业务队列normal_queue;配置业务队列的参数x

dead

letter

exchange和x

dead

letter

routing

key指向死信队列;S2,创建死信队列normal_queue_retry;配置死信队列的参数x

dead

letter

exchange和x

dead

letter

routing

key指向业务队列;S3,配置死信队列的参数x

message

ttl设置补偿消息在死信队列中的存活时间;S4,当业务队列处理消息时,对消息报文头自定义属性retry

times补偿次数进行判断校验;S5,如果存在retry

times属性,则消息为补偿消息并根据阶梯策略判断补偿消息是否到达执行补偿的时间;S6,如果补偿消息已到达最大补偿次数,则直接删除消息;S7,如果补偿消息已到补偿时间,则进行S10的操作;S8,如果补偿消息未到补偿时间,则将消息再返回死信队列中等待下次轮询并进行S13的操作;S9,如果不存在retry

times属性,则消息为正常消息并进行S10的操作;S10,判断消息正常处理是否成功;S11,如果否,则复制当前消息报文并在消息头中添加自定义属性msg

timestamp为当前时间的时间戳,并将消息发送至死信队列;S12,如果是,则正常确认并删除消息;S13,消息在延迟队列到期后通过死信队列的交换机转发至与消息携带的路由键相匹配的业务队列中,以供消费者尝试消费并返回执行S4的操作。2.根据权利要求1所述的基于RabbitMQ死信队列的任务处理方法,其特征在于,所述配置死信队列的参数x

message

ttl设置补偿消息在死信队列中的存活时间,包括:在消息本身的存活时间大于消息所在队列的存活时间的情况下,消息本身的存活时间取决于其所在队列的存活时间;在消息本身的存活时间小于消息所在队列的存活时间的情况下,消息满足本身的存活时间后变为死信。3.根据权利要求1所述的基于RabbitMQ死信队列的任务处理方法,其特征在于,在消息消费异常需要补偿时,采用由消费者自定义消息重新推送消息的方式:使用当前消息队列的消息报文体,创建一条带有自定义消息头的消息;自定义消息头包含字段retry

times和msg

timestamp,最终组合后由消费者主动推送至延迟队列,最后调用basicAck把当前消息队列的消息确认消费,从消息队列中抹除。4.根据权利要求3所述的基于RabbitMQ死信队列的任务处理方法,其特征在于,如果消息头中无自定义字段,代表是首次进入拒绝策略,则retry

times设置初始值1;如果消息头中存在自定义字段,则获取retry

times当前值+1并重新赋值。5.根据权利要求1所述的基于RabbitMQ死信队列的任务处理方法,其特征在于,针对消息执行策略,在消费者获取到消息队列的消息准备业务执行前,增加消费前置校验:校验当前消息队列的消息是否为补偿消息且已达到预期的执行时间;获取消息队列的消息报文头,如果消息报文头中含有自定义字段retry

times,代表当
前消息队列...

【专利技术属性】
技术研发人员:贾建华
申请(专利权)人:南银法巴消费金融有限公司
类型:发明
国别省市:

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

1