什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用。
消息队列的发展历史
- TIB:诞生于1985 年,服务于金融机构和新闻机构
- IBM MQ/WebSphere:诞生于1993 年,商业消息队列平台市场主要玩家
- MSMQ:微软发布于1997年
- JMS:诞生于2001年本质上是一套JavaAPI
- AMQP/RabbitMQ:规范发布于2004年,同年RabbitMQ面市
- Kafka:2010年由Linked开源
- RocketMQ:2011年阿里中间件团队自研
- Pulsar:2012年诞生于Yahoo内部
业界消息队列对比
- Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
- RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些 实时场景中运用较广
- Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
- BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替 换掉对应的Kafka集群
消息队列-Kafka
使用场景
- 搜索服务
- 直播服务
- 订单服务
- 支付服务
- 搜索、点赞、评论、收藏
- 创建集群
- 新增 Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
- Topic:逻辑队列,不同 Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到 Topic
- Consumer:消费者,负责消费 Topic 中的消
- ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干
- Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在 partition
- Replica:每个分片有多个Replica,Leader Replica将会从ISR中选出。
- ZooKeeper:负责存储集群元信息,包括分区分配信息等
Kafka-问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
消息队列- BMQ
兼容 Kafka 协议,存算分离,云原生消息
运维操作对比
| 具体操作 | Kafka | BMQ |
| 重启 | 需要数据复制,分钟级重启 | 重启后可直接对外服务,秒级完成 |
| 替换 | 需要数据复制,分钟级替换,甚至天级别 | 替换后可直接对外服务,秒级完成 |
| 扩容 | 需要数据复制,分钟级扩容,甚至天级别 | 扩容后可直接对外服务,秒级完成 |
| 缩容 | 需要数据复制,分钟级缩容,甚至天级别 | 缩容后可直接对外服务,秒级完成 |
- 简化消息队列客户端复杂度
- 解耦业务与 Topic
- 缓解集群压力,提高吞吐
Parquet
直接在 BMQ 中将数据结构化,通过Parquet Engine,可以使用不同的方式构建 Parquet格式文件。
消息队列- RocketMQ
使用场景
例如,针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时, 也会涉及许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等
RocketMQ 基本概念
| 名称 | Kafka | RocketMQ |
| 逻辑队列 | Topic | Topic |
| 消息体 | Message | Message |
| 标签 | 无 | Tag |
| 分区 | Partition | ConsumerQueue |
| 生产者 | Producer | Producer |
| 生产者集群 | 无 | Producer Group |
| 消费者 | Consumer | Consumer |
| 消费者集群 | Consumer Grou | Consumer Grou |
| 集群控制器 | Controller | Nameserver |