如何保证消息不丢失
丢失的时间节点:存在网络的地方
一:消息丢失问题
可能丢的环节:
1,2,4 网络的丢失问题
3:写入系统缓存,异步刷盘有个时间差也会
生产者:
事务消息
可以使用事务消息类型保证在生产者发送消息时的丢失问题
消息存储转发中间环节
- 同步刷盘,
把刷盘方式flushDiskType配置成同步刷盘,保证消息不丢 - Dledger同步
两段提交的方式保证
一:uncommited
二:commited
类似zk, 半数broker ack才认为是ack
消费端
nameServer挂了消息不丢失
如果全部nameServer都挂了,
那就只能只用本地缓存的路由副本
但是还是会不能正常工作
考虑消费降级,把消息存下来,redis ,文件,或内存
零丢失方案:
- 生产者使用事务消息机制。
- Broker配置同步刷盘+Dledger主从架构
- 消费者不要使用异步消费。
- 整个MQ挂了之后准备降级方案
实际考虑性能,吞吐量,安全,
采用定时对账,补偿机制,异步消息等
二:消息顺序问题
- 全局有序
- 局部有序
对于局部有序,可以把一个局部有序的消息集合发到同一个MessageQueue
或者只配置一个MesssageQueue,默认是4个,这样会影响吞吐量
三:消息积压问题
消费者故障可能导致的问题;
控制台查询消息积压情况:
差值:
可以通过mqadmin后台检查各个Topic的消息延迟
也可以在config目录下落地的json文件
如何处理
每个consumer可以分配多个MessageQueue, 极限就是一个consumer配置一个MessaeQUeueu
也可以把积压的消息转存到一个新的Topic
从集群模式切换至Dledger模式也存在积压消息的问题
四:消息轨迹
消息的关键属性:
Producer端 | Consumer端 | Broker端 |
---|---|---|
生产实例信息 | 消费实例信息 | 消息的Topic |
发送消息时间 | 投递时间,投递轮次 | 消息存储位置 |
消息是否发送成功 | 消息是否消费成功 | 消息的Key值 |
发送耗时 | 消费耗时 | 消息的Tag值 |
打开消息轨迹功能的配置
broker.conf文件中 默认是关闭的 traceTopicEnable=true
轨迹数据存在一个系统的中,RMQ_SYS_TRACE_TOPIC
也可以客户端自定义消息轨迹
核心类:
DefaultMQProducer
DefaultMQPushConsumer
构造的参数打开消息轨迹的存储
- enableMsgTrace:是否打开消息轨迹。默认是false。
- customizedTraceTopic:配置将消息轨迹数据存储到用户指定的Topic 。