数据生产过程
- 对于 producer 要写入的数据, 可以指定四个参数, 分别是: Topic, Partition, Key, Value
- Topic 和 Value 是必须要指定的, Partition 和 Key 是可选的
- 对于一条记录, 先对其进行序列化, 然后按照 Topic 和 Partition 放进对应的发送队列中
- 如果 Partition 没添, 有两种情况
- Key 填了, 按照 Key 进行 Hash, 相同的 Key 去同一个 Partition
- Key 没填, 轮询来选取 Partition
- Producer 将会和 Topic 下所有 LeaderPatition 保持 socket 连接, 消息由 producer 直接通过 socket 发送到 leader Parition
- leader partition 的位置注册在 zookeeper 中
数据消费过程
- 对于消费者,不是以单独的形式存在的,每一个消费者属于一个 consumer group,一个 group 包含多个 consumer
- 订阅 Topic 是以一个消费组来订阅的,发送到 Topic 的消息,只会被订阅此 Topic 的每个 group 中的一个 consumer 消费
- 如果所有的 Consumer 都具有相同的 group,那么就像是一个点对点的消息系统;如果每个 consumer 都具有不同的 group,那么消息会广播给所有的消费者
- 一个 Partition,只能被消费组里的一个消费者消费,但是可以同时被多个消费组消费,消费组里的每个消费者是关联到一个 partition 的
- 对于一个 topic,同一个 group 中不能有多于 partitions 个数的 consumer 同时消费,否则将意味着某些 consumer 将无法得到消息
- 同一个消费组的两个消费者不会同时消费一个 partition
- 在 kafka 中,采用了 pull 方式,即 consumer 在和 broker 建立连接之后,主动去 pull(或者说 fetch )消息
- consumer 端可以根据自己的消费能力适时的去 fetch 消息并处理,且可以控制消息消费的进度(offset)
- 当消息被 consumer 接收之后,需要保存 Offset 记录消费到哪,在 0.10 版本后,Kafka 把这个 Offset 的保存,从 ZK 中剥离,保存在一个名叫 consumeroffsets topic 的 Topic 中
集群架构
- broker : Kafka 集群通常由多个 broker 组成以保持负载平衡。 broker 是无状态的,所以他们使用 ZooKeeper 来维护它们的集群状态。 一个 broker 实例可以每秒处理数十万次读取和写入,每个 Broker 可以处理 TB 的消息,而没有性能影响。 broker leader 选举可以由 ZooKeeper 完成
- zookeeper : ZooKeeper 用于管理和协调 broker。 ZooKeeper 服务主要用于通知生产者和消费者 Kafka 系统中存在任何新 broker 或 Kafka系统中 broker 失效。 根据 Zookeeper 接收到关于 broker 的存在或失效的通知,然后生产者和消费者采取决定并开始与某些其他 broker 协调他们的任务
- producer : 生产者将数据推送给 broker。 当 broker 启动时,所有生产者搜索它并自动向该新 broker 发送消息。 Kafka 生产者不等待来自 broker 的确认,并且发送消息的速度与 broker 可以处理的一样快
- consumer : 因为 Kafka broker 是无状态的,这意味着消费者必须通过使用分区偏移来维护已经消费了多少消息。 如果消费者确认特定的消息偏移,则意味着消费者已经消费了所有先前的消息。 消费者向 broker 发出异步拉取请求,以准备好消耗的字节缓冲区。 消费者可以简单地通过提供 offset 来快退或跳到分区中的任何点
|