mq的常见问题及解决方案

117 阅读2分钟

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锁定队列消费