KafkaConsumer概念
KafkaConsumer向Kafka订阅主题,并从订阅的主题上接收消息。
需求:
假设我们有 个应用程序需要从 Kafka 主题读取消息井验证这些消息,然后再把它们保存起来。应用程序需要创建一个消费者对象,订阅主题并开始接收消息,然后验证消井保存结果。过了一阵子,生产者往主题写入消息的速度超过了应用程序验证数据的速度,这个时候该怎么办?如果只使用单个消费者处理消息,应用程序会远跟不上消息生成的速度。显然,此时很有必要对消费者进行横向伸缩。就像多个生产者可以向相同的主题写入消息一样,我们也可以使用多个消费者从同一个主题读取消息,对消息进行分流。
kafka中可以按消费者划分消费者组,一个消费者组会消费到一个主题里的所有分区。一个新的消费者加入群组时,它读取的是原本由其他消费者读取的消息。当一个消费者被关闭或发生崩愤时,它就离开群组,原本由它读取的分区将由群组里的其他消费者来读取。在主题发生变化时,比如管理员添加了新的分区,会发生分区再均衡。
分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。
在再均衡期间,消费者无法读取消息,造成整个群组一小段时间的不可用。另外,当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,它有可能还需要去刷新缓存,在它重新恢复状态之前会拖慢应用程序。
消费者通过向被指派为群组协调器的 broker (不同的群组可以有不同的协调器)发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系。只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,说明它还在读取分区里的消息。消费者会在轮询消息(为了获取消息)或提交偏移量时发送心跳。如果消费者停止发送心跳的时间足够长,会话就会过期,群组协调器认为它已经死亡,就会触发一次再均衡。
如果一个消费者发生崩溃,井停止读取消息,群组协调器会等待几秒钟,在这几秒钟时间里,死掉的消费者不会读取分区里的消息。然后会清理消费者,消费者会通知协调器它将要离开群组,协调器会立即触发一次再均衡,尽量降低处理停顿。
创建Kafka消费者
创建kafka消费者需要使用3个必要的属性:bootstrap.servers、key.deserializer和value.deserializer
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.8.131:9092");
//deserializer设置如何把byte转成object类型,例子中,通过指定string解析器,
// 我们告诉获取到的消息的key和value只是简单个string类型。
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deseri