| 
   数据生产过程对于 producer 要写入的数据, 可以指定四个参数, 分别是: Topic, Partition, Key, ValueTopic 和 Value 是必须要指定的, Partition 和 Key 是可选的对于一条记录, 先对其进行序列化, 然后按照 Topic 和 Partition 放进对应的发送队列中如果 Partition 没添, 有两种情况 
  Key 填了, 按照 Key 进行 Hash, 相同的 Key 去同一个 PartitionKey 没填, 轮询来选取 Partition
Producer 将会和 Topic 下所有 LeaderPatition 保持 socket 连接, 消息由 producer 直接通过 socket 发送到 leader Paritionleader 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 来快退或跳到分区中的任何点
 |