这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列需要支持 高吞吐、高并发、高可用。
Kafka
使用场景
- 业务日志
- Metrics数据
- 用户行为数据
基本概念
- Topic:逻辑队列,不同Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
- Partition:通常Topic会有多个分片,不同分片之间消息的消息可以并发处理,以提高单个Topic的吞吐
- Offset:消息在Partition内的相对位置信息,可以理解为唯一ID,在Partition内部严格递增
- Replica:分片的副本,分布在不同的机器上,可用来容灾。每个分片有多个Replica,Leader Replica将会从ISR中选出。Leader对外服务,Follower异步去拉取Leader的数据进行同步,如果Leader挂掉,可以将Follower提升为Leader来对外进行服务
- ISR(In-Sync Replicas):同步中的副本。对于Follower来说,始终和Leader有一定差异,当差距较小时,可以将这个Follower副本加入到ISR中,不在ISR中的副本是不允许提升成Leader的
Producer行为
- 批量发送
- 数据压缩
Broker行为
- 顺序写
- 偏移量索引文件
- 时间戳索引文件
- 零拷贝
Consumer行为
- 手动分配
- 自动分配
- Rebalance
Kafka问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller、Coordinator和Broker在同一个进程中,大量IO会造成其性能下降
BMQ
BMQ兼容Kafka协议,存算分离,云原生消息队列
读写流程
- Failover机制
- 写入状态机
高级特性
- 泳道
- Databus
- Mirror
- Index
- Parquet
RocketMQ
高级特性
- 事务消息
- 重试和死信队列
- 延迟队列