消息队列中间件
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
- 云原生架构,轻松在云环境中部署和扩展。
- 多租户支持,租户隔离,独立资源配额和认证。
- 计算存储分离。