小白学技术之分布式流事件处理平台Kafka
小白学技术,用简单的方式做有效的事!
Kafka是什么
Kafka是分布式流事件处理平台,核心功能包括消息队列、流处理
消息队列的优点
- 异步:异步是相对于同步而言的,对于异步来说,任务可以是非线性的,下一个任务的开始不需要等待上一个任务的完成,不同的任务可以互不干扰地进行。在kafka中,生产者发送消息时,将消息放入缓冲区后,无需等待kafka的确认,便可以执行任务的后续操作,由专门的线程进行批量发送;消费者从kafka拉取消息后,可将消息交给独立线程处理,消费者线程继续拉取新的消息,异步处理,提高效率
- 解耦:降低系统之间的耦合度,使多个组件、系统可以独立的部署、运行,互不干扰
- 削峰:降低流量的冲击,在流量高峰时,对流量进行缓冲和处理,避免系统因瞬间的高流量而崩溃
Kafka的特点
- 高吞吐量:Kafka 采用了批量发送、异步发送等技术,能够在短时间内处理大量的消息,其吞吐量可以达到每秒数十万级
- 高可用:分布式集群,一个数据会有多个备份
- 实时性高:延迟一般在ms级
Kafka的适用场景
通过其特点可以看出Kafka适用于数据量大的场景(高吞吐),比如日志系统;消息需要实时传输的场景(实时性高),比如IOT场景下的数据上报、故障上报
Kafka的组成
- Zookeeper:Kafka的注册中心,用于注册和选举
- Broker:kafka的服务节点,负责接收生产者的消息,存储消息,为消息消费者提供读取消息服务,一个kafka集群由多个broker组成
- Producer:消息生产者,将消息数据推送到topic中
- Consumer:消息消费者,从kafka中读取消息数据,消费者可以订阅一个或多个topic,并按照一定顺序读取主题中的消息
- Topic:主题,kafka中消息的逻辑分类,每个主题可以拥有多个Partition分区,不同的分区可以存放在不同的broker上
Kafka的工作流程
- 消息生产:生产者根据指定的主题和分区策略,将消息发送到 Kafka 集群中的 Broker。生产者可以选择将消息发送到特定的分区,也可以让 Kafka 根据消息的键(Key)或轮询等策略自动分配到不同的分区
- 消息存储:Broker 接收到生产者发送的消息后,会将消息追加到相应分区的日志文件中。Kafka 通过分段存储和索引机制,能够高效地存储和查询大量的消息
- 消息消费:消费者向 Kafka 集群发送拉取请求,获取订阅主题中的消息。消费者会记录自己消费到的偏移量(Offset),表示已经消费到的消息位置。下次拉取消息时,会从上次记录的偏移量处开始拉取,保证消息的顺序消费和不重复消费
Kafka集群架构
- 分区(Partition):每个 Topic 可以分为多个 Partition,这是 Kafka 实现高并发和分布式存储的关键。每个 Partition 是一个有序的、不可变的消息序列,消息在 Partition 中按照顺序存储。不同的 Partition 可以分布在不同的 Broker 上,从而实现数据的并行处理和负载均衡
- 副本(Replica):为了保证数据的可靠性和高可用性,Kafka 为每个 Partition 提供了多个副本,包括一个领导者副本(Leader Replica)和多个追随者副本(Follower Replica)。生产者发送的消息会首先发送到 Leader 副本,然后 Follower 副本会从 Leader 副本同步数据。当 Leader 副本所在的 Broker 出现故障时,Kafka 会自动从 Follower 副本中选举出一个新的 Leader,保证数据的正常读写
- 消费者组(Consumer Group):多个消费者可以组成一个消费者组,共同消费一个或多个主题中的消息。每个分区在同一个消费者组中只能被一个消费者消费,这样可以实现消费者之间的负载均衡。不同的消费者组之间可以独立地消费同一个主题的消息,互不影响,方便不同的应用场景对同一批数据进行不同的处理
Kafka的性能(支撑高吞吐、低延迟)
- 顺序读写:Kafka 充分利用了磁盘的顺序读写特性,将消息顺序地写入到日志文件中,大大提高了写入性能。在读取消息时,也可以通过顺序读取索引文件和日志文件来提高读取效率
- 零拷贝技术:Kafka 在数据传输过程中采用了零拷贝技术,避免了数据在用户空间和内核空间之间的多次拷贝,减少了 CPU 和内存的开销,提高了数据传输的效率
- 缓存机制:Kafka 使用了多种缓存机制来提高性能,如页缓存(Page Cache)、内存映射文件(Memory-Mapped Files)等。页缓存可以缓存磁盘上的部分数据,减少磁盘 I/O 操作;内存映射文件可以将磁盘文件映射到内存中,通过操作内存来实现对文件的读写,提高了读写速度
Kafka安装
Linux/ubuntu
- 下载:wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz
- 解压:tar -zxvf kafka_2.13-3.4.0.tgz
- 可选-移动位置:sudo mv kafka_2.13-3.4.0 /opt/kafka
- 为方便使用kafka命令,配置环境变量,编辑`~/.bashrc`
# 末尾添加
export KAFKA_HOME=/opt/kafka
export PATH=$PATH:$KAFKA_HOME/bin
# 生效
source ~/.bashrc
- 启动zookeeper(kafka自带)
zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties &
- 启动kafka服务器
kafka-server-start.sh $KAFKA_HOME/config/server.properties &
- 验证kafka
创建一个主题:
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
向test-topic主题发送消息:kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
打开新的终端,启动消费者,从test-topic获取消息:kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
- 停止服务
kafka-server-stop.sh
zookeeper-server-stop.sh
- 注意事项
# 可能需要开放端口
sudo ufw allow 9092 kafka
sudo ufw allow 2181 zookeeper
windows
- 安装同上
- 启动zookeeper
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
- 启动kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties
不同消息队列的对比
ActiveMQ | RabbitMQ | RocketMQ | Kafka | |
吞吐量 | 万级 | 万级 | 十万级 | 十万级 |
实时性 | 毫秒级 | 微秒级 | 毫秒级 | 毫秒级 |
topic数量对吞吐量的影响 | topic数量从几百到几千对吞吐量影响不大同等配置下支持topic数量最多 | topic数量从几十到几百,吞吐量就会大幅度下降,同等配置下,kafka的topic数量不要过多 | ||
系统可用性 | 主从架构 | 主从架构 | 分布式架构 | 分布式架构,数据多副本 |
消息可靠性 | 较低概率丢失 | 基本不丢失 | 通过配置可实现不丢失 | 通过配置可实现不丢失 |
系统功能性 | MQ领域的功能十分完善 | 延迟低、并发好 | MQ功能较为完善 | MQ功能一般,主要用于实时性、数据量大的场景,比如日志系统 |