Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)

  • 时间:
  • 浏览:1

在启动应用事先,时需记得配置一下输入输出通道对应的物理目标(exchange或topic名),并设置一下分组,比如:

应用场景

或多或少亲戚亲戚亲戚亲戚朋友该配置设置为true的事先,没法该消息在进入到死信队列的事先,会在headers中加入错误信息,如下图所示:



从前,不论亲戚亲戚亲戚亲戚朋友是通过移回原通道防止还是新增订阅防止哪几种消息的事先就都都能否 以此作为最好的办法 进行分类型防止了。

先来总结一下在引入了RabbitMQ的DLQ事先,对于消息异常防止更为完全或多或少的基本思路:

防止什么的什么的问题 (修复系统程序Bug、扩容等最好的办法 )事先,DLQ队列中的消息移回重新防止

深入思考

前五六天亲戚亲戚亲戚亲戚朋友或多或少介绍了并不是Spring Cloud Stream对消息失败的防止策略:

自动重试:对于或多或少因环境是因为(如:网络抖动等不稳定因素)引发的什么的什么的问题 都都能否 起到比较好的作用,提高消息防止的成功率。

或多或少重试依然失败的,日志报错,并进入DLQ队列 日志告警通知相关开发人员,分析什么的什么的问题 是因为

该参数默认是false,或多或少设置了死信队列的事先,会将消息原封不动的发送到死信队列(也或多或少 上边例子中的实现),此时亲戚亲戚亲戚亲戚朋友都都能否 在RabbitMQ控制台中通过Get message(s)功能来看看队列中的消息,应该如下图所示:



这是第两根原始消息。

没法或多或少代码并不是发生逻辑错误,无论重试几块次完全都都能否 或多或少成功,也没法具体的降级业务逻辑,事先在深入思考中讨论过,都都能否 通过日志,或多或少降级逻辑记录的最好的办法 把错误消息保存下来,或多或少事后分析、修复Bug再重新防止。或多或少很显然,从前做非常原始,或多或少太过笨拙,防止复杂性度不够。或多或少,本文将介绍利用上边件结构来便捷发生理该什么的什么的问题 的方案:使用RabbitMQ的DLQ队列。

动手试试

准备4个会消费失败的例子,都都能否 直接沿用前文的工程。也都都能否 新建4个,或多或少创建如下代码的逻辑:

场景一:或多或少消息在业务上发生时效性,进入死信队列事先,过一段时间再防止或多或少没法意义,这俩 事先如保过滤哪几种消息呢?

再来看看这俩 参数:

内容很简单,既蕴藏了消息的生产,也蕴藏了消息消费。消息消费的事先主动抛出了4个异常来模拟消息的消费失败。

场景二:或多或少进入DLQ队列的消息发生各种不同的是因为(不同异常造成的),此时或多或少在做防止最好的办法 的事先,还希望根据哪几种异常做不同的防止事先,亲戚亲戚亲戚亲戚朋友如保区分哪几种消息进入DLQ的是因为呢?

瞬时的环境抖动引起的异常,利用重试功能提高防止成功率

只时需配置4个参数即可:

·END·

原文发布时间为:2018-12-18

本文作者: 翟永超

本文来自云栖社区公司合作 最好的办法 伙伴“系统程序猿DD”,了解相关信息都都能否 关注“didispace”微信公众号

自定义错误防止逻辑:或多或少业务上,消息防止失败事先有明确的降级逻辑都都能否 弥补的,都都能否 采用这俩 最好的办法 ,或多或少2.0.x版本有Bug,2.1.x版本修复。

该参数都都能否 控制DLQ队列中消息的存活时间,当超过配置时间事先,该消息会自动的从DLQ队列中移除。

那是或多或少没法安装对应的插件,只时需根据提示的命令安装就能使用该命令了。

关于RabbitMQ的binder中还有或多或少关于DLQ的配置,这里不一一介绍了,上边几块是目前笔者使用过的几块,或多或少或多或少暂时认为采用默认配置或多或少够用,除非还有或多或少定制要求,或多或少是存量内容,时需去适配才会去配置。读者都都能否 查看官方文档了解更多详情!

在从前的整体思路中,或多或少还涉及或多或少微调,这里举几块常见例子,帮助读者进一步了解或多或少特殊的场景和配置使用!

这里加入了4个重要配置spring.cloud.stream.rabbit.bindings.example-topic-input.consumer.auto-bind-dlq=true,用来开启DLQ(死信队列)。完成了上边配置事先,启动应用并访问localhost:150150/sendMessage?message=hello接口来发送4个消息到MQ中了,此时都都能否 看了消费失败后抛出了异常,消息消费失败,记录了日志。此时,都都能否 查看RabbitMQ的控制台如下:



其中,test-topic.stream-exception-handler.dlq队列或多或少 test-topic.stream-exception-handler的dlq(死信)队列,当test-topic.stream-exception-handler队列中的消息消费事先事先,就会将这条消息原封不动的转存到dlq队列中。从前哪几种没法得到妥善防止的消息就通过简单的配置实现了存储,事先,亲戚亲戚亲戚亲戚朋友还都都能否 通过简单的操作对哪几种消息进行重新消费。亲戚亲戚亲戚亲戚朋友只时需在控制台中点击test-topic.stream-exception-handler.dlq队列的名字进入到详情页面事先,使用Move messages功能,直接将哪几种消息移动回test-topic.stream-exception-handler队列,从前哪几种消息就能重新被消费一次。



或多或少Move messages功能中是如下内容: