-
Kafka
- 基本概念
- Topic:逻辑队列,每个Topic可以建立不同的Partition
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
- Offset:消息在partition内的相对位置信息,ID,严格递增
- Replica:每个分片有多个Replica副本,一个Leader多个Follower
- Producer
- 批量发送:减少IO次数,提高吞吐量
- 数据压缩:减少消息大小,支持Snappy、Gzip、LZ4、ZSTD压缩算法
- 批量发送:减少IO次数,提高吞吐量
- Broker
- 消息文件结构
- 磁盘结构:顺序写减少寻道时间
- 偏移量/时间戳索引文件:二分法查找
- 零拷贝技术
- 消息文件结构
- Consumer
- Low Level(手动分配):线上业务决定哪个Consumer消费哪个Partition
- High Level(自动分配):Coordinator(协调者)实现Rebalance
- Low Level(手动分配):线上业务决定哪个Consumer消费哪个Partition
- 缺点
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller、Coordinator和Broker在同一进程中,大量IO会造成性能下降
- 基本概念
-
BMQ
-
定义:兼容Kafka协议,存算分离,云原生消息队列
Producer -> Consumer -> Proxy -> Broker -> HDFS -> Controller -> Coordinator -> Meta(ZooKeeper)
-
HDFS写文件流程:随机选择一定数量的DataNode进行写入
-
Broker
- Partition状态机:保证对于任意分片在同一时刻只能在一个Broker上存活
- 写文件流程
- 写文件Failover:如果某个DataNode节点挂了或其他原因导致写文件失败,则重新找正常的节点创建新的文件进行写入
- Partition状态机:保证对于任意分片在同一时刻只能在一个Broker上存活
-
Proxy
-
多机房部署(高可用)
-
高级特性:泳道、Databus、Mirror、Index、Parquet
-
泳道消息
- 开发流程:开发 -> BOE -> PPE -> Prod
- BOE:Bytedance Offline Environment,一套完全独立的线下机房环境
- PPE:Product Preview Environment,产品预览环境
-
Databus
- 简化消息队列客户端复杂度
- 解耦业务与Topic
- 缓解集群压力,提高吞吐
-
Mirror
通过最终一致的方式,解决跨Region读写问题。
-
Index
问题:只能Query By Offset or Timestamp,如何实现通过写入的其他字段进行查询?
方案:直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据
-
Parquet——新型列式存储格式
方案:直接在BMQ中将数据结构化,通过Parquet Engine,可以使用不同的方式构建Parquet格式文件
-
-
-
RocketMQ
-
场景:电商业务线、业务峰值时刻(秒杀活动、周年庆)
-
架构
-
存储模型
ConsumerQueue存储的并不是真实的数据,只是这个Queue所有消息在CommitLog上面的的位置(索引),真实数据在CommitLog中
-
高级特性:事务消息、消费重试和死信队列、延迟队列
- 事务消息
- 消费重试和死信队列
- 延迟队列
- 事务消息
-