3.3.1 消费方式

consumer采用pull(拉)模式从broker中读取数据。

cpush(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。

pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,Kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供消费,consumer会等待一段时间之后再返回,这段时长即为timeout。

3.3.2 分区分配策略

首先kafka设定了默认的消费逻辑:一个分区只能被同一个消费者组(ConsumerGroup)内的一个消费者消费。

  一个consumer group中有多个consumer,一个 topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个partition由哪个consumer来消费。

Kafka有三种分配策略,一是Roundrobin,一是Range,还有一个是Stick。

默认情况下:Range策略

  在Range策略情况下,该策略是对于一个Topic而言的一个策略。

  首先对同一个Topic里面的分区按照序号进行排序,冰队消费者按照字母进行排序。然后用Partitions分区的个数除以消费者的消费者线程总数来决定每个消费者消费几个分区,如果除不尽,则前面的几个消费者线程会多消费一个分区。

java kafka消费失败不想重试 kafka消费失败策略_kafka

RoundRobin

  前提:同一个Consumer Group,每个消费者订阅的主题必须相等

  在RoundRobin策略下,分区的数据是以轮询的方式进行分配分配到消费者

java kafka消费失败不想重试 kafka消费失败策略_kafka_02


Stick策略

  Sticky分配策略,这种分配策略是在kafka的0.11.X版本才开始引入的,是目前最复杂也是最优秀的分配策略。

 &emspSticky分配策略的原理比较复杂,它的设计主要实现了两个目的:(1)分区的分配要尽可能的均匀;(2)分区的分配尽可能的与上次分配的保持相同。

  根据者这两个目的,首先该策略采用RoundRobin的方式进行轮询的分配分配给消费者消费,如过在某一个过程中消费者挂了,那么这个消费者消费的分区就会被拿出来再根据RoundRobin策略分配给健康的消费者,已到达尽可能均匀并且不进行重新分配所有分区以此实现分区的分配尽可能的与上次分配的保持相同。

如图:C2消费者宕机前:

java kafka消费失败不想重试 kafka消费失败策略_数据_03


如图:C2消费者宕机后:

java kafka消费失败不想重试 kafka消费失败策略_java kafka消费失败不想重试_04