大数据大数据开发

大数据开发:详解Kafka消费者

2021-03-23  本文已影响0人  成都加米谷大数据

Kafka提供的消息队列服务,涉及到非常重要的核心概念,有生产者、消费者、控制器等等。要理解Kafka的工作机制,必须对这些核心概念都理解透彻才行。今天的大数据学习开发分享,我们来详细讲讲Kafka消费者的部分。

Kafka消费者的消费方式

消息队列有两种消费消息的方式,push(微信公众号)、pull(kafka)。在实时消息流越来越多的背景下,push模式很难适应消费速率不同的消费者,而pull的方式可以根据消费者的消费能力以适当的速率消费消息。

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

Kafka消费者分区分配策略

一个消费者组有多个消费者,一个topic有多个partition。所以必然会涉及到partition的分配问题,即确定哪个partition由哪个消费者来消费。Kafka提供两种方式,一种是轮询(RountRobin)对于topic组生效,一种是(Range)对于单个topic生效

轮询:前置条件是需要一个消费者里的消费者订阅的是相同的topic。不然就会出现问题;非默认的的方式。

同一个消费者组里的消费者不能同时消费同一个分区,比如三个消费者消费一个topic的9个分区。

如果一个消费者组里有2个消费者,这个消费者组里同时消费2个topic,每个topic又有三个partition。首先会把2个topic当做一个主题,然后根据topic和partition做hash,然后在按照hash排序。然后轮询分配给一个消费者组中的2个消费者。

如果是下面这样的方式订阅的呢?

比如有3个topic,每个topic有3个partition,一个消费者组中有2个消费者。消费者1订阅topic1和topic2,消费者2订阅topic2和topic3。那么这样的场景,使用轮训的方式订阅topic就会有问题。

如果是下面这种方式订阅呢?

比如有2个topic,每个topic有3个partition,一个消费者组有2个消费者,消费者1订阅topic1,消费者2订阅topic2,这样使用轮训的方式订阅topic也会有问题。

所以,使用轮训的方式订阅topic的前提是一个消费者组中的所有消费者订阅的主题是一样的;所以轮询的方式不是Kafka默认的方式;Range是按照单个topic来划分的,默认的分配方式。

Range的问题会出现消费者数据不均衡的问题。比如,一个消费者组订阅了2个topic,就会出现消费者1消费4个partition,而另外一个消费者只消费2个partition。

分区策略什么时候会触发呢?当消费者组里的消费者个数变化的时候,会触发分区策略调整,比如消费者里增加消费者,或者减少消费者。

Kafka消费者维护offset

由于消费者在消费过程中可能会出现断电宕机等故障,消费者恢复后,需要从故障前的位置继续消费,所以消费者需要实施记录自己消费哪个offset,以便故障恢复后继续消费。

Offset保存的位置有2个,一个ZooKeeper,一个是Kafka。Offset保存到ZooKeeper,由消费者组、topic、partition三个元素确定唯一的offset。所以消费者组中的某个消费者挂掉之后,或者的消费者还是可以拿到这个offset。

Controller这个节点和ZooKeeper通信,同步数据,这个节点就是谁先起来,谁就先注册controller,谁就是controller。其他节点和controller信息保持同步。

关于大数据开发,详解Kafka消费者,以上就为大家做了简单的介绍了。Kafka的消费者分区策略部分,是尤其需要大家去仔细搞懂的,另外也需要结合到之前的生产者去拉通来理解。

上一篇下一篇

猜你喜欢

热点阅读