Kafka入门
概念
- Broker 中间人 单独一个Kafka节点是一个Broker,Kafka集群由多个Broker组成
- Topic 主题 一个主题由一个或多个消息构成
- Producer 生产者 向Broker发送消息
- Consumer 消费者 从Broker拉取消息消费
- ConsumerGroup 消费组 由一类有相似行为的消费者构成,同一个消息只能被消费组中的一个消费者消费
- Partition 分区,实际存储消息的地方,每个Topic都由一个或多个Partition构成
架构
用Doker部署一个Kafka集群
- 拉取Zookeeper 镜像
docker pull wurstmeister/zookeeper
- 拉取Kafka 镜像
docker pull wurstmeister/kafka
- 运行Zookeeper 容器
docker run -d --name zookeeperct -p 2181:2181 wurstmeister/zookeeper
// -d 后台运行 --name指定名字为zookeeperct -p用宿主机的2181端口映射容器2181
- 运行Kafka容器
docker run -d --name kafkact -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.17.0.1:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.17.0.1:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
// -e 设置环境变量
//-e KAFKA_BROKER_ID=0 配置BROKER_ID,集群中唯一
//-e KAFKA_ZOOKEEPER_CONNECT=172.17.0.1:2181//kafka 配置ZOOKEEPER IP,用docker inspect zookeeperct 命令查看
//-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT//172.17.0.1:9092 //把kafka的地址端口注册给zookeeper
//-e KAFKA_LISTENERS=PLAINTEXT//0.0.0.0:9092 配置kafka的监听端口
- 如果启动失败,查看容器日志
docker logs -f -t --tail 50 kafkact
- 测试发送和接收消息
//进入容器
docker exec -it kafka bash
//运行生产者脚本
/opt/kafka_2.12-2.5.0/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic furit
> apple
> origin
//运行消费者脚本
/opt/kafka_2.12-2.5.0/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic furit
运行流程
-
生产者定期向主题发送消息。
-
Kafka broker将所有消息存储在为该特定主题配置的分区中。它确保消息在分区之间平等共享。如果生产者发送两个消息,并且有两个分区,则Kafka将在第一个分区中存储一个消息,在第二个分区中存储第二个消息。
-
消费者订阅一个特定的主题。
-
一旦消费者订阅了一个主题,Kafka将向消费者提供该主题的当前偏移量,并将偏移量保存在ZooKeeper中。
-
消费者将定期请求Kafka新消息。
-
一旦Kafka收到来自生产者的消息,它会将这些消息转发给消费者。
-
消费者将收到消息并处理它。
-
一旦消息被处理,消费者将向Kafka broker发送确认。
-
一旦Kafka收到确认,它会将偏移量更改为新值,并在ZooKeeper中进行更新。由于ZooKeeper中保留了偏移量,因此即使在服务器出现故障时,消费者也可以正确读取下一条消息。