Kafka学习笔记(2)——角色

Kafka 角色

一个典型的Kafka集群包含若干个生产者(Producer), 若干代理(Broker), 若干消费者(Consumer)组成Consumer Group, 和一个ZooKeeper集群.

Producer通过push将消息发布到Broker, Consumer通过pull从Broker订阅并消费消息.

Kafka使用主题(Topic)作为消息通信载体, 发布者发布一条消息, 该消息通过主题传递给所有的订阅者.

Broker

代理(Broker)可以看做一个独立的Kafka实例. 多个Broker组成一个Cluster.

Broker Controller选举

Broker Cluster受zooKeeper管理, 所有Broker节点在启动时都会在ZooKeeper上注册临时节点, 但只有第一个Broker注册成功, 其他的都会失败, 注册成功的Broker成为Controller, 注册失败的Broker通过watch接收Controller变更的通知.

如果此Controller宕机, 注册在ZooKeeper上的临时节点就会失效, 此时其他的Broker去ZooKeeper上注册临时节点, 注册成功的Broker成为新的Controller.

Topic & Partition

Kafka的消息通过主题(Topic)进行分类, 一个Topic可以包含若干个分区(Partition), 实现数据的冗余和伸缩性, 不同的Partition可以分布在不同的服务器上, 实现高性能.

消息以追加的方式写入Partition, 消费者以先进先出的顺序进行读取, 可以保证单个Partition内消息的顺序性, 但无法保证整个Topic内消息的顺序性.

每个Partition还具有多个副本(Replica)实现数据的冗余.

Producer

生产者负责创建消息, 一般情况下, 生产者把消息均衡地分布在指定Topic的所有Partition上, 也可以通过自定义分区器实现把消息写入到指定的Partition.

Consumer

消费者负责消费消息, 消费者可以订阅一个或多个主题, 并按照消息生成的顺序读取它们.

Consumer Group

单个消费者无法跟上数据生成的速度时, 可以增加更多的消费者, 分担负载、分别处理分区的消息, 形成消费者组.

同一个分区只能被同一个消费者组里的一个消费者读取, 不可能出现同一个分区被同一个消费者组里的多个消费者共同消费的情况. 如果一个消息需要被多个消费者消费, 那这些消费者必须在不同的消费者组.

一个消费者组里无论有多少个消费者, 都会把topic下所有的Partition消费了, 当消费者组内消费者数量小于分区数量时, 会出现一个消费者消费多个分区的情况; 当消费者数量大于分区数量时, 就会有消费者线程空闲; 因此效率最好的情况是消费者数量等于分区数量.

多个消费者组消费同一个topic下的message, 它们的offset互不影响, 这些message会被重复消费.

ZooKeeper

ZooKeeper为Kafka提供元数据管理的功能, 保存Broker信息和Consumer信息.

  • 管理Broker和Consumer的动态加入与离开;
  • 提供消费者组的负载均衡Rebalance;
  • 维护消费关系和Partition的消费信息.