Kafka-消费者-KafkaConsumer分析总结

news/2024/6/18 13:15:06 标签: kafka, 分布式

在这里插入图片描述

KafkaConsumer依赖SubscriptionState管理订阅的Topic集合和Partition的消费状态,通过ConsumerCoordinator与服务端的GroupCoordinator交互,完成Rebalance操作并请求最近提交的offset。

Fetcher负责从Kafka中拉取消息并进行解析,同时参与position的重置操作,提供获取指定Topic的集群元数据的操作。上述操作的所有请求都是通过ConsumerNetworkClient缓存并发送的,在ConsumerNetworkClient中还维护了定时任务队列,用来完成HearbeatTask任务和AutoCommitTask任务。NetworkClient在接收到上述请求的响应时会调用相应回调,最终交给其对应的*Handler以及RequestFuture的监听器进行处理。

KafkaConsumer并不是一个线程安全的类。为了防止多线程并发操作,KafkaConsumer提供了多线程并发的检测机制,涉及的方法是acquire和release。这两个方法的代码如下:

在这里插入图片描述
在这里插入图片描述
我们可以看出,这并不是一种锁的实现,仅实现了检测多线程并发操作的检测。这里使用CAS操作可以保证线程之间的可见性。CAS操作、可见性等相关概念请参考Java并发专栏。

面我们来分析KafkaConsumer.poll方法进行消息消费的整个流程以及相关代码:
在这里插入图片描述
注意,在消费完消息之后,客户端还需要commit offset,手动同步commit offset使用commitSync(),手动异步commit offset使用commitAsync(),自动commit offset使用定时任务AutoCommitTask。

在这里插入图片描述
在pollOnce方法中会先通过ConsumerCoordinator与GroupCoordinator交互完成Rebalance操作,之后从GroupCoordinator获取最近一次提交的offset(或重置position),最后才是使用Fetcher,从Kafka获取消息进行消费。


http://www.niftyadmin.cn/n/5343784.html

相关文章

题记(29)--魔咒词典

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后,Unity报错:显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

PIL、cv2、numpy,和pytorch(torch)之间的转换

在图像处理和深度学习中,经常需要在PIL(Python Imaging Library)、OpenCV(cv2)、NumPy和PyTorch之间进行图像数据的转换。下面是这些库之间常见的转换方法。 1. PIL和numpy之间的转换 import numpy as np from PIL i…

一周时间,开发了一款封面图生成工具

介绍 这是一款封面图的制作工具,根据简单的配置即可生成一张好看的封面图,目前已有七款主题可以选择。做这个工具的初衷来自平时写文章,都为封面图发愁,去图片 网站上搜索很难找到满意的,而且当你要的图如果要搭配上文…

Package g++ is not configured yet.

问题描述 安装依赖包提示Package g is not configured yet. rootubuntu:/opt# dpkg -i build-essential_12.4ubuntu1_amd64.deb (Reading database ... 70742 files and directories currently installed.) Preparing to unpack build-essential_12.4ubuntu1_amd64.deb ... U…

pytorch中BCELoss 和 binary_cross_entropy_with_logits之间的区别

在PyTorch中,binary_cross_entropy_with_logits是一个函数,而BCELoss是一个类。它们都是用于二分类任务的损失函数。它们之间存在一些区别如下。 torch.nn.functional.binary_cross_entropy_with_logits: binary_cross_entropy_with_logits…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写,1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

LLM、GPT和人工智能之间的关系和区别,你知道多少?

LLM(Large Language Model)、GPT(Generative Pre-trained Transformer)和人工智能之间的关系如下: 定义 人工智能 首先,人工智能(Artificial Intelligence,AI)是一门研…