mq消息一致性

幂等:

  1. 落表状态
  2. Redis设置key,setnx也能,但都不能设置过期时间或需要设置较长时间

======================== 一致性 =============================
一. MQ消息生产端: 本地业务与消息生产者

  1. 本地业务与发送MQ同一个事务(生产者发送重试(rocketMQ默认2次),一般处理方式,杜绝不了会出现不一致的情况)
    目前生产环境处理方式,兼有业务重试机制
  2. 事务消息(rocketMQ)
  3. 独立消息服务

二. MQ消息生产端与消费端:
一般依靠MQ重试机制,从而保证最终一致性

三. 重试:


image.png

四. rocketMQ消息丢失:
首先在如下三个部分都可能会出现丢失消息的情况:
Producer端
Broker端
Consumer端

  1. 生产端: 重试(默认2次)
producer.setRetryTimesWhenSendFailed(10);//重试10次
  1. broker: 通过同步刷盘防止
## 默认情况为 ASYNC_FLUSH,修改为同步刷盘:SYNC_FLUSH,实际场景看业务,同步刷盘效率肯定不如异步刷盘高。
flushDiskType = SYNC_FLUSH 

Consumer端: 完全消费正常后在进行手动ack确认

五. rocketMQ的消息堆积如何处理
下游消费系统如果宕机了,导致几百万条消息在消息中间件里积压,此时怎么处理?
你们线上是否遇到过消息积压的生产故障?如果没遇到过,你考虑一下如何应对?
首先要找到是什么原因导致的消息堆积,是Producer太多了,Consumer太少了导致的还是说其他情况, 总之先定位问题。然后看下消息消费速度是否正常,正常的话,可以通过上线更多consumer临时解决消息堆 积问题

追问:如果Consumer和Queue不对等,上线了多台也在短时间内无法消费完堆积的消息怎么
办?
1. 准备一个临时的topic
2. queue的数量是堆积的几倍
3. queue分布到多Broker中
4. 上线一台Consumer做消息的搬运工,把原来Topic中的消息挪到新的Topic里,不做业务逻辑处理,只是
挪过去
5. 上线N台Consumer同时消费临时Topic中的数据
6. 修复原来的Consumer,继续消费之前的Topic

追问:堆积时间过长消息超时了?
RocketMQ中的消息只会在commitLog被删除的时候才会消失,不会超时。也就是说未被消费的消息不会存在
超时删除这情况。

追问:堆积的消息会不会进死信队列?
不会,消息在消费失败后会进入重试队列(%RETRY%+ConsumerGroup),16次(默认16次,messageDelayLevel 没有1,2级别直接从第3级别开始重试,延时消息级别才是18个)才会进入死信队列
(%DLQ%+ConsumerGroup)。

1)死信消息具有以下特性:

  1. 不会再被消费者正常消费。
  2. 有效期与正常消息相同,均为 3 天,3 天后会被自动删除。因此,请在死信消息产生后的 3 天内及时处理。

文献:
https://blog.csdn.net/qingwufeiyang_530/article/details/110563298

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容