消息队列场景
- 系统崩溃后的恢复:当系统崩溃或删除时,如何恢复数据和状态。
- 大规模订单处理:在大规模订单涌入时,系统如何高效处理。
- 链路耗时优化:如何优化长尾链路的耗时。
- 日志存储问题:如何有效存储和处理日志,以便快速修复问题。
消息队列的主要作用
- 解耦:将系统的各个组件解耦,使得各个组件可以独立开发、部署和扩展。
- 削峰:通过消息队列缓冲高峰期的请求,避免系统过载。
- 异步:支持异步处理,提高系统的响应速度和吞吐量。
- 日志处理:高效存储和处理日志,便于后续分析和故障排查。
消息队列是啥
消息队列简单说是一个保存消息的容器,本质上是一个队列。但它需要支持高吞吐、高并发,并且高可用。消息队列的过程:生产者 -> Message -> 消息队列 -> 消费者。常见的消息队列有Kafka、BMQ、RocketMQ
Kafka
场景
- 离线消息处理:处理大规模数据流。
- 日志信息处理:收集和处理日志数据。
- 程序状态信息采集处理:监控和管理程序状态。
- 用户行为:分析用户行为数据。
使用
- 创建集群
- 新增Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
- Topic:逻辑队列,不同主题的消息存储在不同的Topic中。
- Cluster:物理集群,每个集群中可以建立多个不同的Topic。
- Producer:生产者,负责将业务消息发送到Topic中。
- Consumer:消费者,负责消费Topic中的消息。
- ConsumerGroup:消费者组,不同组的Consumer消费进度互不干涉。
Topic中的分区
- Partition:Topic中的分区,支持并发处理。
- Offset:消息在Partition内的相对位置信息,可以理解为唯一ID,在Partition内部严格递增。
Partition的副本
- Replica:每个分片有多个副本,其中一个为Leader副本,其他为Follower副本。
- Leader Replica:从ISR(In-Sync Replicas)中选出。
- Follower Replica:备份副本,差距过大可能会被剔除,根据时间戳划分。
Broker
- Controller:负责分配任务。
- 顺序写:采用顺序写入,减少寻道时间。
Kafka的上层
- Zookeeper:负责存储集群元信息,包括分区分配信息等。
消息流程
Producer -> 生产 -> Broker -> 消费 -> Consumer
大量消息优化思路
- 批量发送:减少IO次数,增强发送能力。
- 压缩:采用zstd等压缩算法,减少消息大小。
日志文件
- LogSegment:日志文件,偏移量索引文件,时间戳索引文件。
- 二分法:查找小于目标offset或时间戳的最大文件位置。
Partition分配
- 手动分配:根据业务需求手动分配,不能容灾,但速度快。
- Coordinator:自动分配,帮助Consumer自动分配。
提高吞吐和稳定性的方法
- Producer:批量发送、数据压缩
- Broker:顺序写,消息索引,零拷贝
- Consumer:Rebalance
Kafka的缺点
- 运维成本高:维护和管理复杂。
- 负载不均衡:在某些场景下,解决方案复杂。
- 没有自己的缓存:完全依赖Page Cache。
- Controller和Coordinator:与Broker在同一进程中,大量IO可能影响性能。
结合kafka面试题
在面试的时候,见的Kafka相关问题包括:
1、Kafka的基本架构和核心概念:Kafka由Producer、Broker、Consumer和ConsumerGroup组成。Topic是逻辑队列,Partition支持并发,Offset是消息的唯一标识。Replica机制确保高可用性,Leader和Follower副本协同工作。
2、Kafka的高吞吐和高并发特性:Kafka通过批量发送、消息压缩、顺序写入和零拷贝技术实现高吞吐和低延迟。这些技术减少了网络传输和磁盘I/O的开销,提高了整体性能。
3、Kafka的消费模型:Kafka支持两种消费模型,一种是基于Pull的模型,另一种是基于Push的模型。Consumer通过Rebalance机制自动分配Partition,确保负载均衡和故障恢复。
4、Kafka的容错性和高可用性:Kafka通过Replica机制和ISR(In-Sync Replicas)确保数据的可靠性和高可用性。Leader副本负责处理读写请求,Follower副本同步数据,当Leader故障时,ISR中的一个Follower会被选为新的Leader。
5、Kafka的常见应用场景:Kafka常用于日志收集、实时数据分析、消息传递和事件驱动架构。在这些场景中,Kafka的高吞吐、低延迟和可扩展性优势明显。