与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题拉取消息。不过在使用 KafkaConsumer 之前需要了解消费者与消费组的概念,否则无法理解如何使用 KafkaConsumer。
一、消费者与消费组
消费者(Consumer)负责订阅主题(Topic),并从订阅的主题上拉取消息。与其他消息中间间不同的是,再Kafka消费者观念里还有一层消费组(Consumer Group)。当消息发送到主题后,主题只会把消息发送给订阅它的消费组内的一个消费者。
Kafka comsumer Group
按照Kafka的默认规则,
消费组A每个消费者分配到了 Kafka 这个主题的一个分区,
消费组B每个消费者分配到了 Kafka 这个主题的两个分区,两个消费组之间互不影响。即 Topic 中的一条消息,会被组A 和组B 分别消费一次。
每个消费者只能消费所分配到的分区中的消息。换言之,每一个分区只能被一个消费组中的一个消费者消费。
消费者和消费组间的关系
1、每个消费者都只有一个对应的消费组。
2、一个消费组可以包含一个或多个消费者。
主题和分区间的关系
1、一个主题可以有多个分区,也就是所有分区的消息集合就是主题的消息。
主题和消费组间的关系
1、一个主题可以被多个消费组订阅。
2、消费组中消费者的数目如果大于订阅的主题中分区的数目,则存在空闲的消费者(订阅不到分区)。
分区和消费者间的关系
1、每个分区中的消息只能被订阅其主题的消费组消费;分区中的消息只能被订阅得消费组中的一个消费者(组内)消费。
2、每个消费者只能消费所分配到的分区中的消息。
消费者和消费组的这种模型可以让整体的消费能力具备横向伸缩性,可以增加或减少消费者的个数来提高或减少整体消费能力。
分区分配策略可以通过消费者客户端的 partition.assignment.strategy 参数来设置消费者与订阅主题之间的分区分配策略。
对于消息中间件而已,一般有两种消息投递模式:
1、点对点(P2P,Point-to-Point)模式和发布/订阅(Pub/Sub)模式。点对点模式是基于队列的,生产者将消息发送到队列,消费者从队列接收消息。
2、发布/订阅模式定义了如何向一个内容节点发送和订阅消息,这个内容节点在Kafka中为主题(Topic)相当于一个中介,生产者发布消息到主题,而消费者消费所订阅的主题。
主题使消息的订阅者和发布者互相保持独立,不需要接触就可以进行消息的传递,发布/订阅模式在消息一对多广播时使用。Kafka同时支持这两种模式,正是得益于消费者和消费组模型的契合。
二、消费者客户端开发
一个正常的消费逻辑需要具备以下几个步骤:
配置消费者客户端参数及创建相应的消费者实例。
订阅主题
拉取消息并消费
提交消费位移
关闭消费者实例
默认配置是从订阅开始后,才开始消费新消息如果需要从起始位置消费那么需要修改消费者客户端参数。
2.1、必要的参数配置
在创建真正的消费者实例之前需要做参数配置,比如上节设置消费组名称、连接地址等。
1、bootstrap.servers:该参数的释义和生产者客户端 KafkaProducer 中的相同。
2、key.deserializer 和 value.dese