Kafka消费者组
您可以通过用例或功能将消费者组合成消费者组。一个消费者组可能负责将记录传送到高速的、基于内存的微服务,而另一个消费者组将这些记录传输到Hadoop。消费者组有自己的名称以便于从其它消费者组中区分出来。
消费者组具有唯一的ID。每个消费者组是一个或多个Kafka主题的订阅者。每个消费者组维护其每个主题分区的偏移量。如果您需要多个订阅者,那么您有多个消费者组。一个记录只交付给消费者组中的一个消费者。
消费者组中的每个消费者处理记录,并且该组中只有一个消费者将获得相同的记录。消费组内的消费者均衡的处理记录。
消费者将记住他们上次离开时的偏移量
消费者组每个分区都有自己的偏移量
Kafka消费者分担负载
Kafka消费者将消费在一个消费者组内的消费者实例上所划分的分区。消费者组中的每个消费者都是分区的“公平共享”的独家消费者。这就是Kafka如何在消费者组中对消费者进行负载平衡。消费者组内的消费者成员资格由Kafka协议动态处理。如果新消费者加入消费者组,它将获得一个分区份额。如果消费者死亡,其分区将分发到消费者组中剩余的消费者。这就是Kafka如何在消费者组中处理消费者的失败。
Kafka消费者故障转移
消费者在成功处理记录之后通知Kafka Broker,从而将偏移量提前。
如果消费者在向Kafka Broker发送提交偏移量之前失败,则不同的消费者可以从最后一次提交的偏移量继续处理。
如果消费者在处理记录后失败,但在向Broker发送提交之前,则可能会重新处理一些Kafka记录。在这种情况下,Kafka实现至少一次行为,您应该确保消息(记录传送)是幂等的。
偏移量管理
Kafka将偏移数据存储在名为“__consumer_offset”的主题中。这些主题使用日志压缩,这意味着它们只保存每个键的最新值。
当消费者处理数据时,它应该提交偏移量。如果消费者进程死机,则可以根据存储在“__consumer_offset”中的偏移量启动并开始读取它所在的位置,或者由商量好的消费者组中的另一个消费者可以接管。
Kafka消费者可以看到什么?
Kafka消费者可以消费哪些记录?消费者无法读取未复制的数据。Kafka消费者只能消费分区之外的“高水印”偏移量的消息。 “日志结束偏移”是写入日志分区的最后一个记录的偏移量,生产者写入下一个记录。
“高水印”是成功复制到所有分区追随者的最后一条记录的偏移量。消费者只读取“高水印”。
消费者对分区进行负载分担
来自同一消费者组的单个消费者只能访问单个分区。如果消费者组计数超过分区数量,则额外的消费者保持闲置。 Kafka可以使用空闲的消费者进行故障切换。如果存在比消费者组更多的分区,那么一些消费者将从多个分区读取。
一个有两个服务器拥有4个分区的Kafka集群
请注意,服务器1具有主题分区P2,P3和P4,而服务器2具有分区P0,P1和P5。请注意,消费者组A的消费者C0正在处理P0和P2的记录。请注意,任何消费者从任何消费者组中都不会共享单个分区。请注意,每个分区都获得相应主题分区的公平份额。
多线程的Kafka消费者
您可以通过使用线程在JVM进程中运行多个Consumer。
多个线程运行消费者
如果处理记录需要一段时间,单个消费者可以运行多个线程来处理记录,但是更难以管理每个线程/任务的偏移量。如果一个消费者运行多个线程,则相同分区上的两个消息可以被两个不同的线程处理,这使得很难在没有复杂的线程协调的情况下保证记录传递顺序。如果处理单个任务需要很长时间,但是尝试避免此设置,则此设置可能是适当的。
每个线程一个消费者
如果您需要运行多个消费者,则在自己的线程中运行每个消费者。这样,Kafka可以向消费者提供记录批次,消费者不必担心偏移顺序。每个消费者的线程使得管理偏移更容易。管理故障切换(每个进程运行X个消费者线程)也更简单,因为您可以允许Kafka首当其冲的工作。
Kafka消费者回顾
什么是消费者组?
消费者组是一组相关消费者,执行任务,例如将数据放入Hadoop或向服务发送消息。消费者组每个分区具有唯一的偏移量。不同的消费者组可以从分区中的不同位置读取。
每个消费者组是否有自己的偏移量?
是的。消费者组对于主题中的每个分区都有自己的偏移量,这对于其他消费者组具有唯一性。
消费者什么时候可以看到记录?
记录完全复制到所有跟随者后,消费者可以看到记录。
如果消费者比分区更多,会发生什么?
额外的消费者仍然空闲,直到另一个消费者死亡
如果在同一个JVM中的许多线程中运行多个消费者,会发生什么?
每个线程管理该消费者组的一个分区份额。