消息队列

选型要点 勾 ✔ 叉 ✖

功能性 Kafka Pulsar RocketMQ RabbitMQ NSQ
消费推拉模式 pull push pull push push
延迟队列
死信队列
优先级队列
消息回溯
消息持久化
消息确认机制 Offset Offset+单条 Offset 单条 单条
消息TTL
多租户隔离
消息顺序性 分区有序 流模式有序 消费者加锁
消息查询
消息可靠性 request.requeired.acks Ack Quorum Size(Qa)) 镜像模式 mem-queue-size
高可用 分布式 分布式 主从 主从 分布式
集群扩容 增加节点,通过复制数据均衡 增加节点,通过新增分片负载均衡 增加节点 增加节点 增加节点

RabbitMQ

死信队列,用来存放那些没有成功消费的消息,通常可以用来作为消息重试

消息被拒绝、消息过期、队列达到最大长度

  • 路由键和生产者发布消息事指定的路由键不同,导致找不到消费者,导致无法消费
  • 消息本身问题,莫格关键词为空无法消费,一直处理失败,反复重新进入队列,引起消息积压
  • 消息队列的数量超过了设置的最大队列长度

延时队列用来存放指定时间被处理元素的队列,未支付订单取消

常用交换器

  • direct 点对点,一对一,交换机绑定队列,消息与特定路由键匹配
  • topic 主题交换机,或通配符交换机,使用通配符去匹配路由到对应的队列
  • fanout 队列绑定到交换机上,发送到交换机的消息会被转发与该交换机绑定的所有队列上,像子网广播(或发布订阅)
  • headers 与上述三种不同,不用路由键匹配,匹配请求头中多所带的键值进行路由

消息积压

  • 增加消费者处理能力,或减少发布频率,增加消费端实例
  • 考虑使用队列最大长度限制
  • 给消息设置TTL,超时丢弃