消息队列 | Kafka vs RabbitMQ

➤ Kafka

  • 模型: 订阅/发布, 生产者和消费者是多对多
  • 存储: 磁盘
  • 吞吐量/延迟: 10W, 毫秒级
  • 架构: 参考 消息队列-Kafka
  • 高可用机制: 参考 消息队列-Kafka-特性实现
  • 如何保证顺序性: 顺序性指 生产者的(带有顺序性的)消息, 如何保证消费者也按照该顺序消费
    • 生产者: 因为kafka 的topic 存储于多个分区, 为了防止一组顺序消息被投放到不同分区, 可以指定消息的key, 相同k的消息一定被发送到相同分区;
    • 消费者: @todo
  • 防重复消费: 消费者在消费掉某条数据后, 把该条数据的offset提交给zk, 下次消费者请求数据, kafka 从 offset处开始
  • 防消息丢失机制: 因为kafka partition 的多副本机制, 要考虑 如果发生leader-follower切换的情况下, 如何不丢数据
    • 生产者丢数据: 设置acks=all, 生产者投递消息, leader 保证所有 partition 都同步了数据才发送 ack 给生产者, 否则生产者会一直重试投递;
    • 消费者丢数据: 关闭消费者的自动提交offet, 需要消费者业务代码手动的提交offset

➤ RabbitMQ

  • 模型: PTP, 生产者消费者1对1
  • 存储: 非持久化的消息一般只存在于内存中,在内存紧张的时候会被换入到磁盘中,以节省内存。
  • 吞吐量/延迟*: 1W, 微秒级
  • 架构: 基于队列实现, 可以”不同业务使用不同MQ实例”来做MQ的垂直切分, 同时RabbitMQ还提供了镜像模式, 即一个队列有多个镜像, 写入队列的数据会被同步到其他镜像队列上去( RbMQ如何实现主队列失效, 切换镜像队列的? )
  • 高可用机制: 镜像模式, 每个RabbitMQ节点上都一个queue的镜像
  • 如何保证顺序性机制: 队列的FIFO, 消费者多线程的情况下如何保证顺序?
  • 防重复消费:
  • 防消息丢失机制:
    • 生产者防丢: confirm 模式, MQ Server 收到生产者发送的消息, 会返一个ack
    • MQ Server防丢: 持久化
    • 消费者防丢: 关闭自动ack, 消费者取到消息, 业务代码处理完后, 再调用 ack api通知 MQ Server

@ref Java高频面试集-消息队列MQ - 掘金