人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道得越多,圆圈也就越大,你不知道的也就越多。

0%

Kafka 消费者组

概念

消费者组,即 Consumer Group,是 Kafka 提供的可扩展且具有容错性的消费者机制。
要理解 Consumer Group,我们需要记住下面这三个特性:

  1. Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯一的一个 Consumer Group。
  2. Consumer Group 下可以有一个或多个 Consumer 实例。这里的实例可以是一个单独的进程,也可以是同一个进程下的线程。在实际场景中,使用进程更为常见一些。
  3. Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其它的 Group 消费。

对比传统消息模型

我们知道,JMS 规范定义了两种消息模型:点对点模型(消息队列)和发布/订阅模型,它们是各有优劣的。
传统的消息队列模型的缺陷在于消息一旦被消费,就会从队列中被删除,而且只能被下游的一个 Consumer 消费。严格来说,这一点不算是缺陷,只能算是它的一个特性。但是显然,这种模型的伸缩性(Scalability)很差,因为下游的多个 Consumer 都要“抢”这个共享消息队列的消息。
发布/订阅模型的缺陷同样是伸缩性不高,因为每个订阅者都必须要订阅主题的所有分区。这种全量订阅的方式既不灵活,也会影像消息的真实投递效果。

使用 Consumer Group 机制,Kafka 同时实现了传统消息引擎系统的两大模型(又避开了这两钟模型的缺陷):如果所有实例都属于同一个 group,那么它实现的就是消息队列模型;如果所有实例分别属于不同的 Group,那么它实现的就是 发布/订阅模型。

消费者实例数量

理想情况下,每个 Consumer Group 下的 Consumer 实例的数量应该等于该 Group 订阅主题的分区总数。一般不推荐设置大于总分区数的 Consumer 实例,设置多余的实例只会浪费资源,而没有任何好处。

小礼物走一走,来 Github 关注我