一、简介
Kafka 是一个分布式消息队列
二、说明
设计
-
生产者
- 负载均衡
- 批量异步发送
-
消费者
- 批量拉取数据
- 监听轮询、控制传输大小
- 单个分区单个消费者维持偏移量
- 流处理提供持久消费者ID
-
消息传递
- 幂等发送
- 流处理提供恰好一次传递
高可用
-
主从复制
- 通过zookeeper心跳机制保持会话
- 从节点同步主节点写入
- 平衡分区主从
-
ISR机制
- 只需两个副本和一次确认
- 无需为崩溃副本恢复完整数据
- 全部崩溃后则等待ISR副本或选择第一个副本
-
ack机制
高并发
- 持久化
- 预读和后写
- 顺序磁盘访问可能比内存随机访问快
- 数据立即写入文件系统的持久日志,不用刷新到磁盘
- 持久化队列将读取附加到文件
- 组合消息批量处理
- 使用sendfile,允许OS将数据从页面缓存直接发送到网络来避免重新复制
- 端到端批量压缩
日志
- 压缩
- 流处理保证最终结果
数据写入过程
- 1、生产者先从 zookeeper 的 "/brokers/…/state"节点找到该 partition 的主节点
- 2、生产者将消息发送给主节点
- 3、主节点将消息写入本地 log
- 4、从节点从主节点pull消息,写入本地log后向主节点发送 ACK
- 5、主节点收到所有ISR中的候选节点的ACK后,增加HW并向producer发送ACK
数据读取过程
流式处理
用于构建关键任务实时应用程序和微服务的客户端库,其中输入和/或输出数据存储在Kafka集群中
三、使用
Docker
1、新建docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
depends_on: [ zookeeper ]
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 0
KAFKA_ZOOKEEPER_CONNECT: 172.28.121.21:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.28.121.21:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
volumes:
- /data/kafka/docker.sock:/var/run/docker.sock
2、docker-compose部署
docker-compose up -d
命令
服务
Topic
生产者
消费者
JAVA
1、新建一个Spring Initializr项目
2、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional&