Kafka入门——消费者

107 阅读3分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

应用程序使用KafkaConsumer 订阅主题并接收这些主题的消息,然后把消息保存起来。

如果生产者对该主题的写入速度很快,单个消费者跟不上消息生成的速度,这时就需要多个消费者共同参与消费,对消息进行分流处理。消费者从属于消费者群组。一个群组中的消费者订阅的都是相同的主题,每个消费者接收主题一部分分区的消息。

向群组中增加消费者是横向伸缩消费能力的主要方式,创建主题时使用比较多的分区数可以在消费负载高的情况下增加消费者来提升性能。消费者的数量如果大于分区数多,那么会有消费者是空闲的,没有任何帮助。

Kafka 一个很重要的特性是:只需写入一次消息,就可以支持任意多的应用读取这个消息。假如新增了一个有两个消费者的消费组,那么就演变为下图这样。

image.png

此时两个消费组都能收到T1 主题的全量消息,在逻辑意义上来说它们属于不同的应用。

总结:如果应用需要读取全量消息,那么请为该应用设置一个消费组;如果该应用消费能力不足,那么可以在这个消费组里增加消费者。

消费者组和分区重平衡

消费者组是什么

消费者组*(Consumer Group)是由一个或多个消费者实例(Consumer Instance)组成的群组,具有可扩展性和可容错性。组内的消费者共享一个消费者组ID(Group ID)*,对一个主题进行订阅和消费,同一组中的消费者只能消费一个分区的消息,多余的消费者会闲置,派不上用场。

两种消费方式

  • 点对点的消费方式:一个消费者群组消费一个主题中的消息。
  • 发布-订阅模式:一个主题中的消息被多个消费者群组共同消费。

消费者重平衡

重平衡:这种把分区的所有权通过一个消费者转到其他消费者的行为。

image.png 当新增或减少消费者时,且消费者的数量小于分区数量时,就会触发重平衡。

优点:为消费者群组带来了高可用性伸缩性,用户可以放心的添加消费者或移除消费者。

缺点:在重平衡期间,消费者无法读取消息,造成整个消费者组在重平衡的期间都不可用。当分区被重新分配给新消费者时,消息当前的读取状态会丢失,它有可能还需要去刷新缓存,在它重新恢复状态之前会拖慢应用程序。