本文主要对几种常见消息队列MQ(ActiveMQ、Kafka、Pulsar、RocketMQ、RabbitMQ)的实现机制和使用场景进行了总结。

MQ思维导图

ActiveMQ

  • 常用操作

    • 获取消息方式
        • 优点
          • 可以尽可能快的发送给消费者
        • 缺点
          • 消费者缓冲区可能溢出
        • 优点
          • 不会造成缓冲区溢出
        • 缺点
          • 有一点延迟
  • 架构

    • 主从架构
  • 劣势

    • 吞吐量不足

Kafka

  • 背景

    • 传统的 ActiveMQ 等消息组件处理消息的吞吐能力较弱
  • 目标

    • 提供高性能、高吞吐量的基础消息组件
  • 优势

    • 高吞吐量
    • 便于横向扩容
  • 劣势

    • 不支持JMS协议
    • 多Topic的时候性能较差
      • 如果分区数量过多,会同时对多个分区进行读写,这个时候性能就会不太好
    • 一个分区只能有一个消费者
  • 应用场景

    • 日志采集
    • 实时数据计算
  • 核心组件

    • Broker
    • Producer
    • Consumer
    • ZK
  • 底层原理

    • 高吞吐量

      • Topic换分为多个Partition,提高并发度
      • 充分利用了磁盘顺序读写的性能
      • 使用Zero-Copy技术
        • 直接在内核态进行数据传输,避免拷贝数据导致内核态和用户态的切换
      • 数据批量发送
      • 数据批量压缩
    • 高查找效率

      • 根据offset为key建立稀疏索引
      • 稀疏索引可以使得索引文档非常小,但是增加了查找消息的时间
  • 常见问题

    • 如何保证 Exactly-Once?
      • [[配置Kafka Exactly-Once消费的方法]]
  • 对比

    • MQ
      • 不支持 JMS 协议

Pulsar

  • 背景
  • 核心组件
    • BookKeeper
      • 存储消息数据
    • Broker
      • 生产者和消费者直接和 Broker 进行连接
    • 参考:
  • 优势
    • 支持百万级消息主题
    • 支持延迟事件
    • 多样的消费模式
      • Exclusive
      • Failover
      • Share
    • 多样的消息重试
    • 支持单条提交
    • 存算分离
      • 可扩展能力强
        • 如果是存算融合的方式,无论存储和计算出现问题,都需要迁移机器,但存储扩展通常迁移大量数据
        • 由于与任一给定 Topic 相关的数据都不会与特定存储节点进行捆绑,因此很容易替换存储节点或扩缩容,集群中最小或最慢的节点也不会成为存储或带宽的短板
  • 劣势
  • 底层原理
    • [[Pulsar实现单条提交的方法]]
  • 应用场景

RocketMQ

  • 背景

    • 起源于 Kafka ,但不是 Kafka 的一个拷贝
    • Kafka 多 Topic 的时候性能比较差
    • 对 Kafka 可靠性传输、事务性做了优化
  • 核心组件

    • NameServer
    • Broker
      • Master
      • Slave

    • Producer
    • Consumer
  • 优势

    • 有线程的管理台界面,便于管理,且可以看到消息的内容

    • 支持通过Tag,Message Header,Message Body进行过滤

    • 便于横向扩展

    • 数据与索引分开存储

    • 同时支持推和拉

    • 多Topic的时候性能好

      • 原因
        • 一个Broker共用一个分区,一个分区支持上万队列
    • 支持事务发送

      • LocalTransactionExecuter
      • TransactionCheckListener
      • RocketMQ从4.3版本开始支持事务,原理为先预提交消息,然后执行本地事务,执行成功正式commit消息,如果没成功commit,会不断的check,check超时则回退本地事务
      • 参考:
  • 劣势

    • 吞吐量没有kafka高
  • 底层原理

    • 高吞吐量

      • Topic划分为多个分区,提高并发度
      • 充分利用磁盘顺序读写的性能
      • 使用Zero-Copy技术
      • 直接在内核态进行数据传输,避免拷贝数据导致内核态和用户态的切换
      • 数据批量发送
      • 数据批量压缩
    • 主从同步

      • 同步双写
      • 异步复制
  • 应用场景

    • 电商
  • 常用操作

  • 对比

    • 和Kafka的比较
      • 吞吐量
        • kafka > rocketmq
      • 数据可靠性
        • 都支持异步/同步刷盘,但 kafka 同步刷盘的情况下,性能急剧下降
      • 顺序消费
        • 都支持顺序消费,但 kafka 在节点宕机的情况下不能保证消息的顺序性
          • 原因
            • 异步复制

RabbitMQ

  • 优势
    • 时延低
    • 社区比较稳定

常识

  • 主要作用

    • 异步
    • 削峰
    • 解耦
  • 如何保证消息的可靠性?

    • Broker
      • 保证多个 replica 都写入成功了才算写入成功
    • 生产者
      • 开启失败不断重试
    • 消费者
      • 不自动提交,消费成功了再自动提交
  • 如何保证消息消费的幂等性?

    • 数据库 upsert
    • redis set
    • 记录到 redis 里面,消费前先查询 redis
  • 如何处理消息挤压?

    • 写一个临时消费者用数据库之类的持久化工具存起来
    • 消费者扩容,如果分区设置相对比较小,对 kafka 没有效果
Contents
  1. 1. ActiveMQ
  2. 2. Kafka
  3. 3. Pulsar
  4. 4. RocketMQ
  5. 5. RabbitMQ
  6. 6. 常识