当前位置:   article > 正文

kafka消费过程原理

kafka消费过程原理

N.1 消费模型

1)Kafka采用拉取模型,由消费者自己记录消费状态,每个消费者互相独立地顺序读取每个分区的消息。如下图所示,有两个消费者(不同消费者组)拉取同一个主题的消息,消费者A的消费进度是3,消费者B的消费进度是6。消费者拉取的最大上限通过最高水位(watermark)控制,生产者最新写入的消息如果还没有达到备份数量,对消费者是不可见的。这种由消费者控制偏移量的优点是:消费者可以按照任意的顺序消费消息。比如,消费者可以重置到旧的偏移量,重新处理之前已经消费过的消息;或者直接跳到最近的位置,从当前的时刻开始消费

————————————————————————

————————————————————————

2)在一些消息系统中,消息代理会在消息被消费之后立即删除消息。如果有不同类型的消费者订阅同一个主题,消息代理可能需要冗余地存储同一消息;或者等所有消费者都消费完才删除,这就需要消息代理跟踪每个消费者的消费状态,这种设计很大程度上限制了消息系统的整体吞吐量和处理延迟。Kafka的做法是生产者发布的所有消息会一致保存在Kafka集群中,不管消息有没有被消费。用户可以通过设置保留时间来清理过期的数据,比如,设置保留策略为两天(设置天数根据自己的业务要求)。那么,在消息发布之后,它可以被不同的消费者消费,在两天之后,过期的消息就会自动清理掉。

N.2 高级API

1)高级API优点

高级API 写起来简单,不需要自行去管理offset,系统通过zookeeper自行管理。不需要管理分区,副本等情况,.系统自动管理。消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据(默认设置1分钟更新一下zookeeper中存的offset)可以使用group来区分对同一个topic 的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响)

2)高级API缺点

不能自行控制offset(对于某些特殊需求来说)

不能细化控制如分区、副本、zk等

N.3 低级API

1)低级 API 优点

能够让开发者自己控制offset,想从哪里读取就从哪里读取。

自行控制连接分区,对分区自定义进行负载均衡

对zookeeper的依赖性降低(如:offset不一定非要靠zk存储,自行存储offset即可,比如存在文件或者内存中)

2)低级API缺点

太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。

N.4 消费者组

1)消费者是以consumer group消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。

N.5 消费方式

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

2)而pull模式则可以根据consumer的消费能力以适当的速率消费消息。

对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。

3)pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小)

N.6 消费者组案例

1)配置文件

[root@bigData112 kafka_2.11]# vi config/consumer.properties

group.id=test_group

[root@bigData113 kafka_2.11]# vi config/consumer.properties

group.id=test_group

2启动kafka集群: bin/kafka-server-start.sh config/server.properties & (注意 :先启动zookeeper)

3)创建主题

[root@bigData111 kafka]$

bin/kafka-topics.sh --zookeeper bigData111:2181 --create --replication-factor 3 --partitions 1 --topic topic_1

4)在bigdata112、bigdata113上分别启动消费者

[root@bigdata112 kafka]$ ./bin/kafka-console-consumer.sh --bootstrap-server bigdata112:9092 --topic topic_1 --consumer.config config/consumer.properties (没有指定组的话 就使用默认,)

[root@bigdata113 kafka]$ ./bin/kafka-console-consumer.sh --bootstrap-server bigdata113:9092 --topic topic_1 --consumer.config config/consumer.properties

5)在bigdata111上启动“生产者”

[root@bigdata111 kafka]$

bin/kafka-console-producer.sh --broker-list bigdata113:9092 --topic topic_1

>hello world

6)查看bigdata111和bigdata112的接收者。

(每个ConsumerGroup消费组 只能对同一个分区最多消费一次,而同一个分区可以被不同组消费)

同一时刻只有一个消费者接收到消息。因为创建的主题就定义了 --partitions 1 分区就一个。而1一个分区只能被一组消里面的一个消费者一次。如果有两个分区就会被另外一个消费。没有特定设置,消费者不会对同一个分区进行第二次消费。

如果不指定 --consumer.config参数 每个消费者都会消费到。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/626104
推荐阅读
相关标签
  

闽ICP备14008679号