Kafka学习笔记(三)-消费者

经过前面两节,我们已经知道消息的传递链路的大致流程:

生产者将消息投递到指定 topic 下的某个 partition 中,在经过 broker 处理后,消费者从指定的 topic 拿到了订阅的数据。

但是我们可能没有意识到,在这段话的语境中,我们想当然的将生产者和消费者的个数限定成了一,当消息传递的两端对象个数都为 1 时,这是一个简单的点对点(P2P,Point-To-Point)模式。

点多点模式我们完全可以用队列来实现,Kafka 的主要用途在于发布/订阅(Pub/Sub)模式。

单消费者 多消费者
单生产者 一对一 一对多
多生产者 多对一 多对多

本节,我们从消费者的消费组开始,记录下客户端的一些概念和细节。

消费组

我们先来想一个问题,一个生产者向指定 topic 下 N 个 partition 发送消息,M个消费者是如何分配消息的呢?

每个分区一定只会对应一个消费者

解决这个大的问题,首先我们先明确一个小问题,一个 partition 能否根据 offset 拆成多份,来让多个消费者消费呢?

答案是不能,前面我们说过,分区要保证分区内的有序性,当多个消费者同时消费同一分区,且分区内的消息按照offset 的顺序是有业务上的依赖的,比如 offset = 1 的消息依赖 offset = 0 消息,这时就会出现问题。因此,每个分区一定只会对应一个消费者

每个消费者消费部分分区

其次我们要问问自己,一个主题下的所有分区的消息是否会被每一个消费者消费呢?

答案也是不能,多消费者可能是一批处理逻辑相同,但是部署在不同服务器上的应用程序,如果每个消费者都要消费所有的消息,那么会造成消息重复。因此,每个消费者只会消费部分分区

消息的分配

在明确以上两点之后,我们来看看主问题的答案:

  • M = 1,消费者消费 N 个 partition。
  • 1 < M < N,默认的分区规则,消费者有一个排序顺序,N 个 partition 首先会平均分配,余出来的 N % M 个分区会按照排序顺序一个一个的分配。
  • M > N,只有 N 个消费者有消息,剩下 M - N 个消费者空闲无消息。

在这种分配策略下,我们往 Kafka 集群中接入了多少个消费者,M 就会是多少。

为了更灵活的控制 M 的大小,使得既不会 M > N 导致资源浪费也不会 M = 1导致消费者服务器压力太大。同时还可以利用 M 来将消费者分类,使得每批消费者功能不同,不会造成消息重复消费。

Kafka 搞了个消费组的概念,每个消费组可以读到 topic 下所有分区的信息,我们可以保证每个消费组的功能不同。

注:消费组是逻辑概念,消费者是实例(服务器、线程等)。

文章作者: yPhantom
文章链接: https://guoyuxiang.cn/2021/03/29/kafka-note-3-consumer/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Life Note