10、消费者分区分配策略:

什么是消费者组?

Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。组内有多个消费者或者消费实例,它们共享一个ID,称为group ID。

  • Consumer Group 下可以有一个或多个 Consumer 实例。这里的实例可以是一个单独的进程,也可以是同一进程下的线程。在实际场景中,使用进程更为常见一些。
  • Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯一的一个 Consumer Group。
  • Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其他的 Group 消费。

消费方式:

  consumer采用pull(拉)的模式从broker中读取数据。

  • push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 consumer 的消费能力以适当的速率消费消息。
  • pull 模式不足之处是,如果 kafka 没有数据,消费者可能会陷入循环中, 一直返回空数据。 针对这一点, Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有数据可供消费, consumer 会等待一段时间之后再返回,这段时长即为 timeout。

分区分配策略:

哪个partition由哪个consumer消费?

Kafka有两种分配策略:round- robin  和 range。kafka默认采用的是range分配,当消费者组中的消费者数量发生改变时,则触发重新分配策略。

  • round- robin重分配策略,主要采用的是一种轮询的方式分配所有的分区,将partition和consumer按照字典序(字符串顺序)排序。然后依次轮询分配,如果当前consumer没有订阅当前分区所在的topic,则轮询的判断下一个consumer。
  • range重分配策略,就是首先会计算各个consumer将会承载的分区数量,然后将指定数量的分区分配给该consumer。其本质上是依次遍历每个topic,然后将这些topic的分区按照其所订阅的consumer数量进行平均的范围分配。

11、消费者offset的存储:

offset的作用:consumer需要实时记录到自己消费到了哪个offset。

(由于 consumer 在消费过程中可能会出现断电宕机等故障, consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费)

Kafka 0.9 版本之前, consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets。它的每条消息格式大致为:

 

12、kafka-zk的作用:

Kafka顺序读写:Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。 官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。

zookeeper在Kafka中的作用:

broker注册:

  • Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。在zk上会有一个专门用来进行Broker服务器列表记录的节点:/brokers/ids
  • 每个Broker就会将自己的IP地址和端口信息记录到该节点中去。

topic注册:

  • 在Kafka中,同一个Topic的消息会被分成多个分区并将其分布在多个Broker上,这些分区信息及与Broker的对应关系也都是由Zookeeper在维护,由专门的节点来记录,如:/borkers/topics

生产者负载均衡,消费者负载均衡:

分区与消费者的关系:

  • 在Kafka中,规定了每个消息分区 只能被同组的一个消费者进行消费,因此,需要在 Zookeeper 上记录 消息分区 与 Consumer 之间的关系,每个消费者一旦确定了对一个消息分区的消费权力,需要将其Consumer ID 写入到 Zookeeper 对应消息分区的临时节点上。

消费 消费速度offset记录:

  • 需要定时地将分区消息的消费进度Offset记录到Zookeeper上,以便在该消费者进行重启或者其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息消费。

消费者注册:

  • 对消费者组中的消费者变化注册监听,对broker服务器变化注册监听,进行消费者负载均衡。
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐