消息队列 | 青训营笔记
消息队列:指保存消息的一个容器,本质是个队列。这个队列需要支持高吞吐,高并发,并且高可用
发展历程
业界消息队列对比
Kafka
使用场景
基本概念
- Topic:逻辑队列,不同Topic可以建立不同的Topic。不同的业务可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic,存放不同的业务数据;
- Producer:生产者, 负责将业务消息发送到Topic中;
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者群,不同组Consumer消费进度互不干涉
- Partiition:Topic的分区,并发处理消息,提升Topic的吞吐能力
Kafka架构
ZooKeeper:负责存储集群元信息,包括分区分配信息等
一条消息的自述
- 当生产者同时发送多条消息时,对信息进行Batch操作,进行批量发送,从而减少IO次数,加强发送能力
Broker消息文件结构
- 将消息以日志形式储存,有清除机制
Broker如何找到消息
- Consumer通过发送FetchRequest请求消息数据,Broker会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
- 用二分法找到小于目标offset的最大索引位置
- 时间戳索引文件与上面类似
Consumer消息分配
通过手动进行分配,哪一个Consumer消费哪一个Partition完全由业务来决定
缺点:
- 有数据中断问题
- 不能自动容灾
Rebalance:Coordinator协助Consumer来选择分区
Kafka问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降