这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
一、本堂课重点内容
- 消息队列的前世今生
- 消息队列-Kafka
- 消息队列-BMQ
- 消息队列-RocketMQ
- 最佳实践
二、详细知识点介绍
1. 消息队列前世今生
- TIB
- 1985,用于高盛,用于解决金融交易。
- IBM MQ
- 1993,商业消息队列平台市场主要玩家
- MSMQ
- 1997,微软消息队列
- JMS
- 2001,试图通过提供公共Java API的方式,隐藏单独MQ产品供应商提供的实际接口,从而跨越了壁垒和解决了互通问题
- AMQP/RabbitMQ
- 2004,一套开放标准
- Kafka
- 2010,为了解决linkedin的数据管道问题
- RocketMQ
- 2011,满足阿里巴巴高频的在线交易场景
- Pulsar
- 2012,为了解决雅虎内部各个部门之间数据的协调
2. Kalfa
2.1 使用场景
可概括为业务日志、用户行为数据、Metrics数据(搜索服务、直播服务、订单服务、支付服务)
2.2 使用流程
创建集群->新增topic->编写生产者逻辑->编写消费者逻辑
2.3 基本概念
- Topic:逻辑队列,不同Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
- Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
- Replica:每个分片有多个Replica,Leader Replica将会从ISR(In-Sync Replicas)中选出
- ZooKeeper:负责存储集群元信息,包括分区分配信息等
2.4 消息流程
Producer->Broke->Consumer
- Producer
- 批量发送,减少IO次数,从而加强发送能力
- 数据压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法
- Broker
- 磁盘结构:移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道的时间成本
- 顺序写,提高写入效率
- 消息抓取:Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
- Consumer
- Partition在Consumer Group中的分配方案
- 手动分配(Low Level):通过手动进行分配,哪一个Consumer消费哪一个Partition完全由业务决定。缺点是不能自动容灾、会导致机器启停问题。优点是比较快。
- 自动分配(High Level):使用Coordinator自动分配。优点是不会存在机器启停问题,分配稳定。
2.5 缺点
- 数据复制问题,运维成本高
- 负载不均衡的场景解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker(意思是controller和coordinator选的同一个broker)在同一进程中,大量IO造成性能下降,一旦broker挂了,影响controller和coordinator
3. BMQ
BMQ兼容Kafka协议,存算分离,支持云原生消息队列。 存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群。
| 具体操作 | Kafka | BMQ |
|---|---|---|
| 重启 | 需要数据复制,分钟级重启 | 重启后可直接对外服务,秒级完成 |
| 替换 | 需要数据复制,分钟级替换,甚至天级别 | 替换后可直接对外服务,秒级完成 |
| 扩容 | 需要数据复制,分钟级扩容,甚至天级别 | 扩容后可直接对外服务,秒级完成 |
| 缩容 | 需要数据复制,分钟级缩容,甚至天级别 | 缩容后可直接对外服务,秒级完成 |
4. RocketMQ
RocketMQ的高级特性:事务消息、重试和死信队列,延迟队列。
低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广。
使用场景:电商业务线、业务峰值时刻。
与Kafka对比:
| 名称 | Kafka | RocketMQ |
|---|---|---|
| 标签 | 无 | Tag |
| 分区 | Partition | ConsumerQueue |
| 生产者集群 | 无 | Producer Group |
| 集群控制器 | Controller | Nameserver |
三、个人总结
本节课介绍了消息队列的前世今生、kafka使用场景,业务日志、用户行为数据、Metrics 数据展开,介绍一条消息从生产到消费的处理流程,以及RocketMQ 的使用场景,同时将 RocketMQ 和 Kafka 进行对比,剖析其特征。