RabbitMQ
1.如何保证消息不丢失?
- 生产者发消息给mq丢失:同步确认和异步确认,手动事务
- 消息存盘不丢失:Classic经典队列,直接将队列声明成为持久化队列
- 主从消息同步不丢失:镜像模式集群
- 消费者不丢失消息:手动应答
2.如何保证消息幂等性?
设定重试次数 集成springboot会议messageid做幂等性判断(redis做判断,布隆过滤器)
3.如何保证顺序消费?
单队列 单消费者
4.如何优化消息堆积问题?
- 生产端:批量消息发送
- 服务端:懒加载机制,sharding分片队列,Stream队列
- 消费端:增加消费者 消费不了的消息转到死信队列避免消息积压
kafka
1.消息丢失
- 发送端:ack=-1,
- 消费端:手动提交
2.消息重复消费
设定重试次数 幂等处理:setnx id
3.消息乱序
- 同步发送,消息发到同一个分区,同一个消费者消费
- 单消费者接受消息按不同的类型转发到不同的内存队列,不同的队列开不同的线程消费
- 消费者通过countDownLatch收集完所有消息 再按消息类型顺序消费
4.消息积压
因为分区和消费者是绑定的所以增加消费者没有用,所以我们通过一个消费者转发到另 外一个主题里面有很多分区进行消费
5.分区
分布式存储
rocketMQ
1.消息不丢失
- 生产者:事务消息
- 消费者:手动应答
- 消息存盘不丢失:同步刷盘
- 主从消息同步不丢失:同步同步数据
2.消息积压
和kafka一样
3.消息轨迹
4.顺序消息
- 发送者:相同的消息key放同一个队列
- 消费者:通过监听messageListenerOrderly锁定队列消费