Willson Chen

Stay Hungry, Stay Foolish.

消息队列中间件

消息队列中间件

RabbitMQ

特点

  • 基于AMQP协议的开源消息队列中间件。
  • 支持消息可靠传递,支持持久化。
  • 吞吐量一般,并发万级。
  • 消息堆积能力一般。

工作模式

  • 简单模式:
    • 一个生产者、一个队列、一个消费者。
  • 工作队列模式:
    • 一个生产者、一个队列、多个消费者。
    • 一条消息只会被一个消费者消费。
    • 默认采用轮询方式分配消息。
  • 发布订阅模式:
    • 一个生产者、一个交换机、多个队列、多个消费者。
    • 队列和消费者一对一。
    • 使用扇出交换机,消息被广播到所有队列。
  • 路由模式:
    • 区别于发布订阅,使用直连交换机,根据路由键转发。
  • 通配符模式:
    • 区别于路由模式,根据通配符匹配转发。

消息可靠性

  • 可靠性投递:
    • 问题:生产者发送消息后,broker宕机或重启,此时无法判断是否成功投递。
    • 解决:使用确认模式,从生产者到交换机,成功时返回确认消息。
    • 问题:消息到交换机后,找不到可以转发的队列,需要通知生产者。
    • 解决:使用退回模式,无法投递时则返回退回消息。
  • 可靠性消费:
    • 问题:消息到达消费者后,还没处理消费者宕机或重启,broker无法判断是否成功消费。
    • 解决:使用手动确认模式,消费者处理成功后需返回确认消息。
  • 重复消息
    • 问题:消费者接收到消息处理后未发送确认,与broker断开连接,再次连接时会重复接收到该消息。
    • 解决:消息中包含唯一的业务ID,在消费端处理幂等。

死信队列

  • 死信:
    • 无法被处理的消息。
    • 来源:
    • 消息过期。
    • 队列达到最大长度。
    • 消息被拒绝,如无法转发到队列,无法被消费且不重回队列。
  • 死信队列:
    • 存放死信的队列。
    • 定义队列时可以指定死信交换机。
    • 消息被拒绝,且不重回队列,则转发到死信交换机。

集群模式

  • 普通集群
    • 元数据存在于所有节点,队列数据仅存在于一个节点。
    • 可以访问任意一个节点读写数据,内部自动访问队列所在节点。
    • 可以提高吞吐量,无法实现高可用,存在单点故障。
  • 镜像集群
    • 在普通集群基础上,配置队列的镜像策略。
    • 使队列数据存在于所有节点。

Kafka

Kafka 特点

  • 开源分布式流处理平台。
  • 高吞吐,并发量十万级。
  • 消息堆积能力较好,可达到亿级。
  • 支持消息持久化。
  • 支持消息批量拉取。

Kafka 相关概念

  • Producer(生产者):生产消息
  • Consumer(消费者):消费消息
  • Consumer Group(消费者组):一个消息只会给组内的一个消费者处理,实现单播与广播的关键。
  • Broker(消息代理):消息服务器
  • Topic(主题):消息分类,一个消息只能属于一个主题。
  • Partition(分区):对Topic的进一步划分,最小存储单元。
  • Replica(副本):分区的多个副本,可存在于多个broker上,用于保证数据可靠性。
  • Leader Replica(领导者副本):负责读写请求。
  • Follower Replica(跟随者副本):负责从Leader同步数据,用于故障转移。

高性能原理

  • 磁盘顺序读写。
  • IO多路复用epoll
  • 零拷贝,mmap内存文件映射。

RocketMQ

  • 阿里开源高性能分布式消息中间件。
  • 性能稍弱于kafka,但是功能性更强,更适合高可靠强一致的业务相关应用场景。
  • 高吞吐,并发量十万级。
  • 支持顺序消息,支持可靠性消息传递。
  • 亿级消息堆积能力。

Pulsar

  • 云原生架构,轻松在云环境中部署和扩展。
  • 多租户支持,租户隔离,独立资源配额和认证。
  • 计算存储分离。