Kafka 架构
整体架构¶
Topic¶
通过主题实现业务的隔离,同一个业务的消息放在同一个主题中。
命令行创建 topic¶
进入 kafka 容器的命令行界面:
docker exec -it broker /bin/bash
进入脚本目录:
cd /opt/kafka/bin
创建 topic:
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test
查看现有topic:
./kafka-topics.sh --list --bootstrap-server localhost:9092
删除 topic:
./kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic test
代码中使用 Topic¶
不需要提前创建主题,只要向某个主题发送消息,就自动创建了
生产者:
发送到指定的 topic
消费者:
Partition 分片¶
每个 Topic 可以划分为多个 Partition(分片)
命令行创建分片¶
创建:
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test --partitions 3
更改:
./kafka-topics.sh --alter --bootstrap-server localhost:9092 --topic test --partitions 5
注意分片数量只能增加不能改小
分片的逻辑结构¶
同一个 partition 中数据有序;同一个 topic 下的不同 partition 之间数据无序
数据流入哪个分片¶
- 指定 partition(很少这样做)
- 指定了 Key,则根据 Key 的 Hash 对 partition 的数量取模来决定进入哪个 partition。只要发送时指定了相同的 Key,则消息回发送到同一个 partition
- 没有指定 partition 也没有指定 key,则使用轮流调度的方法,重复循环
消费者如何消费¶
同一个 Partition 只能被同一个消费者组(Consumer Group)中的一个消费者消费,但是可以被不同的消费者组中的 consumer 同时消费
假设有一个 Topic,包含 3 个 Partition(P0、P1、P2),以及一个消费者组(Group A)中有 2 个消费者(C1、C2):
- Kafka 可能会将 Partition 分配如下:
- C1 消费 P0 和 P1
- C2 消费 P2
- 如果消费者组中有 3 个消费者,则每个消费者会消费一个 Partition。
- 如果消费者组中有 4 个消费者,则有一个消费者会处于空闲状态。
Broker¶
Broker 可以理解为 partition 的载体
Broker 就是一个 Kafka 服务器节点,服务器节点上运行了 Kafka 的应用程序。
Broker 可以用于:
- 存储消息
- 接收客户端的连接
- 支持客户端查询其他 Broker 的信息
- 接收客户端的读写请求
集群部署¶
单机部署就只有一个 Broker,集群则是有多个 Broker 协作提供服务
集群中一个 Broker 使用一个唯一的 ID 来标识
Broker 和 Partition 的关系¶
一个 Partition 只会存在一个 Broker 上,一个 Broker 可以存多个 Partition
Partition 放在 Broker 上的规则就是首先随机挑选一个 Broker 放 Topic 的 partition0,随后顺序依次向后放这个 Topic 下的其他 Partitions
客户端如何连接集群¶
每个 Broker 都会有其他 Broker 的信息,客户端:
- 访问任意一台 Broker
- 得到所有 Broker 的信息列表
- 生产者首先确认是需要放到哪个 partition,再找到这个 partition 所在的 broker