Kafka认证时Successfully logged in真的认证成功了?
背景
某个应用需要配置 Kafka 集群信息,且需要在验证集群是否可达。基本实现思路是创建一个生产者对象,然后发送一条测试数据,调用 Producer
的 send
方法发送消息后,再调用 get()
方法,即同步发送消息,测试通过后再关闭 Producer
对象。
近期碰到了一个机器服务正常,异步消息能正常发送,但是同步一直报异常:
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for topicxxx-0: 20024 ms has passed since batch creation plus linger time
问题排查
Kafka 状态正常,在机器 A 上使用生产者命令异步发送数据,Kafka服务器上消费数据能正常消费:
而应用通过同步发送 API 时一直报超时异常。
解决办法
调大生产者测试代码的超时时间:
//默认是30000ms
producerConfig.put("request.timeout.ms", "300000");
producerConfig.put("transaction.timeout.ms", "300000");
producerConfig.put("max.block.ms", "300000");
producerConfig.put("batch.size", "1048576");
producerConfig.put("linger.ms", "1");
producerConfig.put("buffer.memory", "33554432");
Kafka 生产者和消费者测试命令
对于包含认证的 Kafka 访问自带的生产者和消费者应用时,可以创建一个 config 配置文件 config.properties ,内容主要是 Kafka 地址和访问协议:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="xxx";
添加配置后,常用的三个命令也添加认证:
./kafka-topics.sh --bootstrap-server IP:PORT --list --command-config ../config/config.properties./kafka-console-producer.sh --bootstrap-server IP:port --topic test-topic --producer.config ../config/config.properties./kafka-console-consumer.sh --bootstrap-server IP:port --topic test-topic --consumer.config ../config/config.properties
注意点就是这三个脚本添加配置文件的参数都不相同:
--command-config
--producer.config
--consumer.config
意外发现
排查这个问题的时候,我发现了一个颠覆之前对 Kafka 认证连接的认知。之前以为 Kafka 使用 Java API 连接且设置了认证信息后,只有在认证成功后才会出现一句登录成功的日志信息,之前一直以此作为判断 Kafka 有认证场景下成功连接的依据的。
AbstractLogin 类的 login 方法 53 行打印的:
Successfully logged in.
一直对这句话迷惑了,以为只有连接认证信息正确才会打印这句话呢,所以就没有怀疑过认证信息。后面试了一下其他正常的 Kafka 连接信息,发现因网络问题,还是同样的超时问题,而且这次输入的 Kafka 认证信息是错误了,但是日志中也打印了这个信息。
在网络正常的环境下测试输入错误的 Kafka 认证信息,也打印这个日志了,但是后面却会出现 Auth Fail 异常:
2024-10-26 06:48:55.431 [http-nio-xx-exec-2] INFO o.a.k.c.s.a.AbstractLogin - [login,53] - Successfully logged in.
2024-10-26 06:48:55.434 [http-nio-xx-exec-2] WARN o.a.k.c.p.ProducerConfig - [logUnused,246] - The configuration 'producer.type' was supplied but isn't a known config.
2024-10-26 06:48:55.435 [http-nio-xx-exec-2] INFO o.a.k.c.u.AppInfoParser - [<init>,109] - Kafka version : 1.0.2
2024-10-26 06:48:55.436 [http-nio-xx-exec-2] INFO o.a.k.c.u.AppInfoParser - [<init>,110] - Kafka commitId : 2a121f7b1d402825
2024-10-26 06:48:55.576 [kafka-producer-network-thread | producer-8] ERROR o.a.k.c.NetworkClient - [error,296] - [Producer clientId=producer-8] Connection to node -1 failed authentication due to: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256
从日志打印的线程来看,logged in 操作是在主线程中,真正的认证失败信息发生在生产者线程发生数据并调用 get()
方法获取同步响应结果的时候。
再输入一个无效的 Kafka 连接地址,照样打印了 Successfully logged in 信息,只是生产者发送时报 Broker 不可达:
2024-10-26 06:51:33.906 [http-nio-xx-exec-8] INFO o.a.k.c.s.a.AbstractLogin - [login,53] - Successfully logged in.
2024-10-26 06:51:33.909 [http-nio-xx-exec-8] WARN o.a.k.c.p.ProducerConfig - [logUnused,246] - The configuration 'producer.type' was supplied but isn't a known config.
2024-10-26 06:51:33.910 [http-nio-xx-exec-8] INFO o.a.k.c.u.AppInfoParser - [<init>,109] - Kafka version : 1.0.2
2024-10-26 06:51:33.910 [http-nio-xx-exec-8] INFO o.a.k.c.u.AppInfoParser - [<init>,110] - Kafka commitId : 2a121f7b1d402825
2024-10-26 06:51:53.930 [kafka-producer-network-thread | producer-9] WARN o.a.k.c.NetworkClient - [warn,241] - [Producer clientId=producer-9] Connection to node -1 could not be established. Broker may not be available.
结论:基本可以确定一个事实,当使用 Kafka 连接配置认证信息时,无论什么情况「1、信息正确+地址正确;2、都错误;3、地址正确+认证Info错误」,这句 「Successfully logged in
」都会打印,没有任何意义。
跟踪源码可知,它只代表执行了 jaas 的 login
方法,实际没有任何认证相关的操作。想起上周整理过阿里开发者规范的日志规范,这句话应该属于无效日志。
有效的日志打印,应该在数据发送时认证的地方地方打印登录成功才是合理的。
启示录
Kafka 的 API 只会用,从来没有搞明白过调用流程,尤其它的异步线程 kafka-producer-network-thread
,只管再后台无限制重试,无效的 Kafka 地址和信息和真正的 Broker 异常都报一样的错误。
本文这个问题,试过改超时时间为60秒,还是一样的异常,以为自己排查方向错误了。网络上说的这个问题的原因,都一一排除了。
后来用手动发送异步测试正常后,觉得这个同步请求超时还是网络问题,试着把所有的时间参数都改为300秒后,页面在等待2分钟左右的时候有响应了,数据同步操作成功了。
真的是一个 Bug 找一天!
相关文章:
Kafka认证时Successfully logged in真的认证成功了?
背景 某个应用需要配置 Kafka 集群信息,且需要在验证集群是否可达。基本实现思路是创建一个生产者对象,然后发送一条测试数据,调用 Producer 的 send 方法发送消息后,再调用 get() 方法,即同步发送消息,测…...
软考信息系统管理师,系统集成项目管理工程师,考哪一个合适?
根据2024年的考试安排,高级项目管理师和系统集成工程师考试改为每年一次。 2024年上半年考高级项目管理师,下半年考系统集成项目管理工程师。 根据这个调整,建议先报名5月份的高级项目管理师考试。如果通过了,大家都高兴&#x…...
AI学习指南自然语言处理篇-位置编码(Positional Encoding)
AI学习指南自然语言处理篇-位置编码(Positional Encoding) 目录 引言位置编码的作用位置编码的原理绝对位置编码相对位置编码位置编码在Transformer中的应用位置编码的意义总结 引言 在自然语言处理中,文本数据通常以序列的形式存在。然而…...
macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程
想要把dmg格式转成iso格式,然后能在虚拟机上用,最起码新版的macOS镜像是不能用UltraISO,dmg2iso这种软件了,你直接转放到VMware里绝对读不出来,办法就是,在Mac系统中转换为cdr,然后再转成iso&am…...
【01初识】-初识 RabbitMQ
目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点ÿ…...
CTF-RE 从0到N:汇编层函数调用
windows 在 Windows 平台上的汇编语言中,调用函数的方式通常遵循特定的调用约定(Calling Convention)。最常见的调用约定包括: cdecl: C 默认调用约定,调用者清理堆栈。stdcall: Windows API 默认调用约定࿰…...
雷池社区版compose配置文件解析-mgt
在现代网络安全中,选择合适的 Web 应用防火墙至关重要。雷池(SafeLine)社区版免费切好用。为网站提供全面的保护,帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件,用于定义和管理多个 Dock…...
无人机避障——4D毫米波雷达Octomap从点云建立三维栅格地图
Octomap安装 sudo apt-get install ros-melodic-octomap-ros sudo apt-get install ros-melodic-octomap-msgs sudo apt-get install ros-melodic-octomap-server sudo apt-get install ros-melodic-octomap-rviz-plugins # map_server安装 sudo apt-get install ros-melodic-…...
Python(数据结构2)
常见数据结构 队列 队列(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out) Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、优先队列等。 1 普通队列 queue.Queue 是 Python 标准库 queue 模块中的一个类…...
深入解析HTTP与HTTPS的区别及实现原理
文章目录 引言HTTP协议基础HTTP响应 HTTPS协议SSL/TLS协议 总结参考资料 引言 HTTP(HyperText Transfer Protocol)超文本传输协议是用于从Web服务器传输超文本到本地浏览器的主要协议。随着网络安全意识的提高,HTTPS(HTTP Secure…...
Java IO 模型
I/O 何为 I/O? I/O(Input/Output) 即输入/输出 。 我们先从计算机结构的角度来解读一下 I/O。 根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。 输入设备(比…...
安装双系统后ubuntu无法联网(没有wifi标识)网卡驱动为RTL8852BE
安装双系统后ubuntu没有办法联网,(本篇博客适用的版本为ubuntu20.04)且针对情况为无线网卡驱动未安装的情况 此时没有网络,可以使用手机数据线连接,使用USB共享网络便可解决无法下载的问题。 打开终端使用命令lshw -C …...
Sqoop的安装配置及使用
Sqoop安装前需要检查之前是否安装了Tez,否则会产生版本或依赖冲突,我们需要移除tez-site.xml,并将hadoop中的mapred-site.xml配置文件中的mapreduce驱动改回成yarn,然后分发到其他节点,hive里面配置的tez也要移除,然后…...
R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程加载R包案例数据数据预处理数据描述构建randomForestSRC模型评估模型C-indexBrier score特征重要性构建新的随机森林生存模型风险打分高低风险分组的生存分析时间依赖的ROC(Ti…...
三款计算服务器配置→如何选择科学计算服务器?
科学计算在众多领域都扮演着关键角色,无论是基础科学研究还是实际工程应用,强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器,对于确保科研和工作的顺利进行至关重要。 首先,明确自身需求是重中之重。要仔细考虑计算…...
Oracle 19c RAC删除多余的PDB的方式
文章目录 一、删除PDB并删除数据文件二、删除PDB并保留数据文件三、插拔PDB 一、删除PDB并删除数据文件 所删除的pdb必须是mount的状态才可以删除: #1、关闭pdb alter pluggable database pdb_name close immediate instancesall; #2、删除pdb以及数据文件 drop p…...
什么是云渲染?云渲染有什么用?一篇看懂云渲染意思
你知道云渲染是怎么回事吗? 其实就是把3D模型变成2D图像的过程,只不过这个过程是在云端完成的。我们在本地啥都不用做,只需要等结果就行。 现在云渲染主要有两种类型:一种是物理机房云渲染,另一种是服务器机房云渲染。…...
MATLAB中 exist函数用法
目录 语法 说明 示例 检查工作区变量是否存在 检查文件夹是否存在 检查 MATLAB 函数是否为内置函数 exist函数的功能是检查变量、脚本、函数、文件夹或类的存在情况。 语法 exist name exist name searchType A exist(___) 说明 exist name 以数字形式返回 name 的类…...
在银河麒麟系统中Qt连接达梦数据库
解决在银河麒麟系统中使用Qt连接达梦数据库提示:project Error library odbc is not defined问题 一、编译ODBC 下载解压unixODBC(http://www.unixodbc.org/unixODBC-2.3.1.tar.gz) 打开终端,切换到unixODBC-2.3.1目录下&#x…...
nodejs 服务器实现负载均衡
server.js const express require(express); const { createProxyMiddleware } require(http-proxy-middleware); const axios require(axios);const app express();// 定义后端服务列表 const services [{ target: http://localhost:3001 },{ target: http://localhost:…...
今日总结10.29
常见序列化协议有哪些 序列化(serialization)是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等。常见的序列化协议包括以下几…...
使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图
最近那个男人写的汉语新解火遍了全网,那个男人叫李继刚,国内玩 AI 的同学如果不知道这个名字,可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词,效果却顶得上几千行代码写出来的应用程序。 这段提示词…...
vue3+ts实时播放视频,视频分屏
使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图,四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏:</span><el-icon …...
【网页设计】学成在线案例
Demo 典型的企业级网站,目的是为了整体感知企业级网站的布局流程,复习以前知识。 集合代码见文章最后。 5.1 准备素材和工具 学成在线 PSD 源文件。开发工具 PS(切图) sublime(代码) chrome࿰…...
一篇文章总结 SQL 基础知识点
1. 官方文档 MySQL:https://dev.mysql.com/doc/refman/8.4/en/ SQL Server:What is SQL Server? - SQL Server | Microsoft Learn Oracle:https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loe.html 2. 术语 SQL S…...
vue Element U 解决表格数据不更新问题
最近在使用 Vue 和 Element UI 开发后台管理系统时,操作表单数据重新请求表格接口后遇到表格数据不更新的问题。后面查阅了些资料,这通常是由于 Vue 的响应式系统没有检测到数据的变化,或者数据更新后没有正确地触发视图的重新渲染。以下是一…...
PeView 命令行PE文件解析工具
PeView 是一款基于C/C开发的命令行版PE文件解析工具,专门用于解析Windows可执行文件并提供详尽的文件结构和交互式查询功能,帮助用户理解和分析目标程序的内部构成,是逆向分析和软件调试中的重要工具,本次分享工具源代码及使用方法…...
微信小程序25__实现卡片变换
先看效果图 实现代码如下: <view class"page" style"filter:hue-rotate({{rotation}}deg)"><view class"prev" catchtap"toPrev">《《《</view><view class"next" catchtap"toNext&q…...
使用Git进行团队协作开发
使用Git进行团队协作开发 Git简介 安装Git 在Windows上安装Git 在macOS上安装Git 在Linux上安装Git 设置Git用户信息 创建Git仓库 基本Git命令 添加文件 提交更改 查看状态 克隆仓库 推送更改 获取更改 分支管理 创建分支 切换分支 合并分支 删除分支 解决合并冲突 检查冲突…...
期货跟单、量化交易模拟演示系统
一、跟单下单 在“排行榜”中选择要跟单的用户,合约可以跟全部,也可以指定跟该用户的某一合约操作,选定跟单的倍数(操作手数的倍数)/手数(指定手数,可以不是对方的倍数),…...
哪做网站/百度推广登录平台官网
程序分目录管理 szz_aip:工程目录bin:可执行文件 start.pyconfig:配置文件 setting.pylib:工具类、初始化服务类、接口类 interface.py 接口 tools.py 工具logs:日志readme.txt:说明 setting.p…...
做网站用什么电脑配置/公司域名注册步骤
1) 创建接口项目和实现类项目; 编写接口,编写实现类。 接口类库 namespace MyIBLL {public interface IUserBll{bool Check(string username, string pwd);void AddNew(string username, string pwd);} } 实现接口类库 namespace MyBLLImpl {public cla…...
研发app大概要多少钱/百度代做seo排名
一、DDoS趋势的一些变化 从今年3月份起,世界上最大的DDoS攻击记录到了1.7 Tbps,是一个普通家庭带宽出口的数十万倍,几乎可以横扫互联网,作为一个生存了20年之久的古老攻击形式,我们看到了今年来DDoS攻击量成指数级攀升…...
浙江广厦建设职业技术学院招生网站/长尾关键词爱站网
1、确认系统已经安装了SSH。rpm –qa | grep opensshyum install ssh -y ##安装SSH协议2、生成秘钥对ssh-keygen -t rsa -P ##直接回车生成的密钥对:id_rsa和id_rsa.pub,默认存储在用户的目录下 如:/home/oldboy/.ssh。 如下࿱…...
wordpress 会员插件/广州百度竞价外包
Mac OS X - 重置 MySQL Root 密码您是否忘记了Mac OS 的MySQL的root密码? 通过以下4步就可重新设置新密码:1. 停止 mysql server. 通常是在 ‘系统偏好设置‘ > MySQL > ‘Stop MySQL Server‘2. 打开终端,输入:sudo /usr/local/my…...
网站建设公司运营/app推广引流
java 对称加密算法实现详解发布时间:2020-08-24 14:26:05来源:脚本之家阅读:99作者:小破孩123前言对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下ÿ…...