Kafka 进阶学习(四)—— 消费者和消费组

1,544 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

本文是我 Kafka 学习的第 4 天,今天学习的是 Kafka 的两个基本概念,消费者和消费组。

基本概念

与生产者对应的就是消费者,消费者(Consumer)负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。

对于 Kafka 来说,Consumer 与 Topic 之前还有一层消息组(Consumer Group),每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者。消费者组是 Kafka 实现 单播广播 两种消息模型的基础和手段。对于同一个Topic 来说,每个消费者组都可以拿到这个 Topic 中的全部数据。消费者组内的所有消费者协调在一起来订阅并消费 Kafka Topic 中的所有分区。这里,每个分区只能由同一个消费者组内的一个消费者来消费。

对于消息中间件而言,一般有两种消息投递模式:点对点(P2P,Point-to-Point)模式发布/订阅(Pub/Sub)模式

  • 点对点模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息。

  • 发布/订阅模式则应用在消息的一对多广播时;

Topic 使得消息的订阅者和发布者互相保持独立,Kafka 同时支持两种消息投递模式,而这正是得益于消费者与消费组模型的契合:

  • 如果所有的消费者都隶属于同一个消费组,那么所有的消息都会被均衡地投递给每一个消费者,即每条消息只会被一个消费者处理,这就相当于点对点模式的应用。

  • 如果所有的消费者都隶属于不同的消费组,那么所有的消息都会被广播给所有的消费者,即每条消息会被所有的消费者处理,这就相当于发布/订阅模式的应用。

消费组是一个逻辑上的概念,它将旗下的消费者归为一类,每一个消费者只隶属于一个消费组。每一个消费组都会有一个固定的名称,消费者在进行消费前需要指定其所属消费组的名称,这个可以通过消费者客户端参数 group.id 来配置,默认值为空字符串。消费者并非逻辑上的概念,它是实际的应用实例,它可以是一个线程,也可以是一个进程。同一个消费组内的消费者既可以部署在同一台机器上,也可以部署在不同的机器上。

Partition 和消费者对应关系

kafka 为了保证同一类型的消息顺序性(FIFO),一个 Partition 只能被同一组的一个 Consumer 消费,不同组的 Consumer 可以消费同一个 Partition。但是一个 Consumer 可以消费多个 Partition。其消费关系如下:

  • Consumer > Partition:当 Consumer 数量大于 Partition 数量时,同一个 Partition 内的消息只能被同一个组中的一个 Consumer 消费。多余的消费者空闲。

  • Consumer < Partition:存在一个 Consumer 消费多个 Partition 的情况;

  • Consumer = Partition:Consumer 和 Partition 之前是一一对应的关系,一个 Consumer 负责一个 Partition。

即同一个partition内的消息只能被同一个组中的一个consumer消费。当消费者数量多于partition的数量时,多余的消费者空闲。

消费步骤

一个正常的消费逻辑需要具备以下几个步骤:

  1. 配置消费者客户端参数及创建相应的消费者实例。

  2. 订阅主题。

  3. 拉取消息并消费。

  4. 提交消费位移。

  5. 关闭消费者实例。

参考文档

  • 《深入理解 Kafka:核心设计与实践原理》—— 朱忠华

往期文章