安装
1 | wget https://downloads.apache.org/kafka/2.6.0/kafka_2.13-2.6.0.tgz |
启动
1 | 启动zookeeper |
相关命令
1 |
|
简介
kafka 是一个分布式数据流处理系统。
- kafka 以集群的方式运行在一台或多台服务器上
- kafka 集群用 topic 来分类存储数据流
- 每个数据都包含 key,value,timestamp
partition
topic 是发布消息的一个通道,topic 可被多个客户端订阅,topic 可向多个客户端发送订阅信息。对于每一个 topic,可能包含多个 partition
partition 的规则
- 如果没有指定 key 值并且可用 partition 个数大于 0 时,在就可用 partition 中做轮询决定消息分配到哪个 partition
- 如果没有指定 key 值并且没有可用 partition 时,在所有 partition 中轮询决定小心分配到哪个 partition
- 如果指定 key,对 key 值做 hash 分配到指定的 partion
在 java 中,我们可以指定 partition 规则来确保消息全部发送至一个 partition
1 | public class MyPartion implements Partitioner { |
1 | public class PartionProducer { |
partition 详情
partition 是一个有序日志,在 partition 上每个 consumer 有唯一 offset 表示当前消费的位置。partition 日志在一段时间内是持久保存在服务器上的,不管 consumer 是否消费,可通过配置数据的保留策略设置消息的过期时间。 通过操作 offset,我们可以读取还未过期的历史数据,也可以跳过当前数据读取已经写入 kafka 的未来数据
消费者
在 kafka 中 consumer 隶属于 consumer group.
- topic 中的一个 partition 只能被同一个 group 的一个 consumer 消费。即发布到该 topic 的记录会根据 partition 的分区规则推送到指定的 consumer 去消费,而不是所有 consumer 都会受到消息。若订阅该 topic 的同一个组的 consumer 数量大于 partition 数量时,将会有 consumer 空闲
- topic 中的一个 partition 可以被其他 group 的一个 consumer 消费。即发布到该 topic 的记录会广播给所有订阅该 topic 的 group 中的一个 consumer 去消费
例如