李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
09.Kafka消费过程分析
Leefs
2021-09-24 PM
1550℃
0条
[TOC] ### 一、消费者模型 #### 1.1 概念 消息由生产者发布到Kafka集群后,会被消费者消费。 **消息的消费模型有两种:** + 推送模型(Push) + 拉取模型(Pull)。 #### 1.2 推送模型(push) + 基于推送模型(push)的消息系统,有消息代理记录消费者的消费状态。 + 消息代理在将消息推送到消费者后,标记这条消息已经消费,但这种方式无法很好地保证消费被处理。 + 如果要保证消息被处理,消息代理发送完消息后,要设置状态为“已发送”,只要收到消费者的确认请求后才更新为“已消费”,这就需要代理中记录所有的消费状态,但显然这种方式不可取。 **缺点** + **push模式很难适应消费速率不同的消费者** 因为消息发送速率是由broker决定的,push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。 #### 1.3 拉取模式(pull) kafka采用拉取模型,由消费者自己记录消费状态,每个消费者互相独立地顺序拉取每个分区的消息。 ![09.Kafka消费过程分析01.jpg](https://lilinchao.com/usr/uploads/2021/09/4076953475.jpg) **说明** + 有两个消费者(不同消费者组)拉取同一个主题的消息,消费者A的消费进度是3,消费者B的消费进度是6。 + 消费者拉取的最大上限通过最高水位(watermark)控制,生产者最新写入的消息如果还没有达到备份数量,对消费者是不可见的。 + 这种由消费者控制偏移量的优点是:**消费者可以按照任意的顺序消费消息**。比如,消费者可以重置到旧的偏移量,重新处理之前已经消费过的消息;或者直接跳到最近的位置,从当前的时刻开始消费。 ##### 消费消息处理策略 **在一些消息系统中,消息代理会在消息被消费之后立即删除消息。** 如果有不同类型的消费者订阅同一个主题,消息代理可能需要冗余地存储同一消息;或者等所有消费者都消费完才删除,这就需要消息代理跟踪每个消费者的消费状态,这种设计很大程度上限制了消息系统的整体吞吐量和处理延迟。 ##### Kafka消费消息处理策略 Kafka的做法是生产者发布的所有消息会一致保存在Kafka集群中,不管消息有没有被消费。 用户可以通过设置保留时间来清理过期的数据,比如,设置保留策略为两天。那么,在消息发布之后,它可以被不同的消费者消费,在两天之后,过期的消息就会自动清理掉。 ### 二、消费者组 消费者是以consumer group消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。 ![09.Kafka消费过程分析02.png](https://lilinchao.com/usr/uploads/2021/09/4111870395.png) **说明** 上图中,有一个由三个消费者组成的group,有一个消费者读取主题中的两个分区,另外两个分别读取一个分区。某个消费者读取某个分区,也可以叫做某个消费者是某个分区的拥有者。 **优点** + 消费者可以通过水平扩展的方式同时读取大量的消息。 + 如果一个消费者失败了,那么其他的group成员会自动负载均衡读取之前失败的消费者读取的分区。 ### 三、消费方式 consumer 采用 pull(拉)模式从 broker中读取数据。 **pull方式优点** + pull 模式可以根据 consumer 的消费能力以适当的速率消费消息 **缺点** + 如果 kafka 没有数据,消费者可能会陷入循环中,一直返回空数据。 针对这一点,Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有数据可供消费,consumer 会等待一段时间之后再返回,这段时长即为 timeout。 *附参考文章链接:* *https://blog.csdn.net/qq_34886352/article/details/84303860*
标签:
Kafka
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1524.html
上一篇
08.Kafka生产者数据可靠性保证
下一篇
10.【转载】Kafka重平衡机制
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
JavaScript
JavaWeb
Sentinel
FileBeat
人工智能
Stream流
Java编程思想
随笔
Linux
Docker
线程池
Python
JavaSE
Golang基础
Spark SQL
GET和POST
MyBatisX
前端
NIO
哈希表
Tomcat
Filter
FastDFS
队列
Kibana
Spring
Java阻塞队列
SQL练习题
散列
CentOS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞