KafkaConsumer


KafkaConsumer 可以从Kafka集群中消费记录。


KafkaConsumer 客户端明确的处理Kafka Brokers的失败,并且明确的在Kafka集群中获取topic分区信息。KafkaConsumer 同时与Broker进行交互,并且允许consumer中的KafkaConsumer实例来负载均衡的消费记录。


KafkaConsumer 保持与Kafka 集群中的broker TCP长链接来获取record数据。 如果,忘记关闭KafkaConsumer 将导致链接的泄露。KafkaConsumer不是线程安全的。


Offsets 和Consumer Position


Kafka 为每一个分区中的每一个记录保存着一个有序的OffSet. Offset 在每一个分区中作为记录的唯一标示。同时,也是标识每一个记录在分区中的位置。

例如: 如果一个consumer在位置5上面,那么这个consumer消费了offset =0 和offset =4区间内的记录,下一个消费的offset将是5.


Position标识消费者下一个将要消费的offset位置。 当KafkaConsumer 使用Poll()方法接收到消息后,Position 将会自动增加。


Commited Posistion 是KafkaConsumer 已经安全存储的最后一个OffSet.  如果,KafkaConsumer 重启或者宕机,这个offset将会恢复。

KafkaProducer 既可以阶段性的自动提交。或者选择通过commitSync()或者commitAsync()方法来人为控制commited posistion.



Consumer Groups 和Topic  subscription  


Kafka  使用 Consumer Group 概念 来允许一组KafkaConsumer 来把消费、处理记录的工作来划分。 这些Kafka Consumer 可以允许在同一个机器上面或者分布在不同的地方。 所有的KafkaConsumer 通过group.id 来区分。 group.id相同的KafkaConsumer 组成同一个Consumer Group.


在Consumer Group 中的每一个KafkaConsumer 都可以通过subscript() API 接口动态的订阅一系列的他们想要订阅的TOPIC。Kafka将把消息分发到每一个订阅TOPIC的ConsumerGroup中。   这样可以把TOPIC下面的分区均衡到ConsumerGroup中的每一个KafkaConsuumer.所以,在同一个ConsumerGroup中每一个分区仅仅分配到一个KafkaConsumer中。

例如: 有4个分区,2个KafkaConsumer .那么每一个KafkaConsumer 将要处理2个分区。



在ConsumerGroup 中的KafkaConsumer 是动态的。同时,分区也是动态的。 KafkaConsumer的增加或者减少,以及分区的增加或者减少,都会导致重新平衡。


Manual  Partion  Assignment 

我们可以订阅我们感兴趣的通道, 并且让Kafka动态分配一个公平的分区到ConsumerGroup 中的每一个活动的KafkaConsumer中去。但是,在一些场景中,我们需要控制指定的分区来消费。例如:



Storing Offsets OUtside Kafka 


Kafka Consumer 不需要使用Kafka内置offset存储机制。 可以根据自己的选择来存储Offset. 


比如:

如果record 消费结果存在关系型数据库中,同时把offset存储在数据库中,那么就可以利用数据库的事物机制,允许把消费记录的结果和存储Offset 在同一个事物中提交。



每一个记录都有自己的Offset,所以如果是自己来管理offset的存储,需要做下面的步骤。

1、enable.auto.commit =false 

2、通过ConsumerRecord 来保存位置

3、当重启重新存储posistion时,调用seek(TopicPartition,long)方法



Control  The Consumer's  Posistion 


在大多数情况下,Kafka Consumer 都是从按照从开始位置到结束位置简单的逻辑来消费记录,同时提交commited position. 但是,Kafka 允许 Consumer来人工控制Position..

向前或者向后消费记录。 这样就意味着kafka Consumer 可以重新消费旧记录,或者跳过最新的记录。


下面几个例子可以表明Kafka Consumer 人工控制位置是非常有用的。



Consumption Flow Control 

当一个KafkaConsumer 订阅了多个分区并且获取数据,那么他将同时所有订阅的分区中同时消费记录,如果为这些分区赋予不同的优先级那么消费会更加的高效。

在某些情况下,Kafka Consumer 想全力以赴的消费某些分区的数据,当这些分配有比较少数据时或者没有数据时,在去消费其他分配的数据。


在流处理情况下,处理器从两个topic中获取数据,并且执行join操作在这两个topic上面。


Kafka通过pasue() 和resume()方法来控制消费流。


KafkaConsumer类不是一个线程安全的类。那么所有的网络IO操作可能在任何线程中被调用。那么就需要用户确保多线程访问可以合理的同步

你可能感兴趣的:(KafkaConsumer)