Kafka认证时Successfully logged in真的认证成功了?

背景

某个应用需要配置 Kafka 集群信息,且需要在验证集群是否可达。基本实现思路是创建一个生产者对象,然后发送一条测试数据,调用 Producersend 方法发送消息后,再调用 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

注意点就是这三个脚本添加配置文件的参数都不相同:

  1. --command-config
  2. --producer.config
  3. --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 找一天!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot后端开发常用工具详细介绍——flyway数据库版本控制工具

文章目录 什么是flyway简介为什么要使用flyway 流程介绍整合springboot添加pom文件配置flyway向resource/db/migration添加sql文件 注意事项1. 迁移报错2. 迁移顺序 参考 什么是flyway 简介 为什么要使用flyway 我们在开发时往往会有这样一种情况&#xff1a; 进行软件开发…

【Linux系统编程】线程深入运用

目录 一&#xff0c;C线程与系统线程 二&#xff0c;分离线程 三&#xff0c;线程结构 四&#xff0c;__thread关键字 五&#xff0c;Linux线程互斥 1&#xff0c;线程互斥相关的背景概念 2&#xff0c;互斥锁 3&#xff0c;死锁 4&#xff0c;互斥锁的弊端 六&#…

2024年10月25日练习(双指针算法)

一.283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 1.题目描述&#xff1a; 这里题目要求了说必须在不复制数组的情况下对数组进行原地操作&#xff0c;所以说不能来用暴力的解法来 实现。 2.算法原理&#xff1a; 这个题目就是经典的数组划分&#xff0c;数组分块问题…

react-signature-canvas 实现画笔与橡皮擦功能

react-signature-canvas git 地址 代码示例 import React, { Component } from react import { createRoot } from react-dom/clientimport SignaturePad from ../../src/index.tsximport * as styles from ./styles.module.cssclass App extends Component {state { trimmed…

NLTK无法下载?

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 nltk无法下载怎么办&#xff1f;什么是NLTK&#xff1f;为什么要用NLTK&#xff1f;如何下载&#xff1f; nltk无法下载怎么办&#xff1f; 什么是NLTK&#xff1f; NLTK是学习自然…

【Qt】窗口——Qt窗口的概念、常用的窗口函数、菜单栏、工具栏、状态栏、浮动窗口、对话框

文章目录 Qt窗口Qt窗口的概念菜单栏工具栏状态栏浮动窗口对话框 Qt 窗口 Qt窗口的概念 QMainWindow 类概述&#xff1a; QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;它继承自 QWidget 类&#xff0c;并且提供了一个预定义的布局。 菜单栏 菜单栏常用属性&#xf…

紫光同创——盘古 50KN 网口板

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一、开发系统介绍 盘古 50KN 网口板开发板&#xff08;MES50H-Ethernet&#xff09;采用了核心板扩展板的结 构&#…

---synchronized 关键字---

在多线程编程中&#xff0c;由于代码的并发执行&#xff0c;导致了不同的线程在修改相同的变量会导致变量的值错误 比如 变量 c 2&#xff0c;这里有线程A 和 B一起使用 c变量并对他加1&#xff0c;这时就会有多中情况 这里要注意的是变量c是储存在内存中的&#xff0c;而线…

【git】 git 删除了文件,如何找回

git 删除了文件&#xff0c;如何找回 使用 git revert 并不是恢复误删除文件的最佳方法&#xff0c;因为 git revert 通常用于撤销已经提交的更改&#xff08;生成一个反向提交&#xff09;。如果你误删除了文件&#xff0c;还未提交更改&#xff0c;或者已经提交但想恢复删除…

2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷

2024年9月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 选择题 第 1 题 单选题 以下python表达式的值为True的是&#xff1f;&#xff08; &#xff09; A.all( ,1,2,3) B.any([]) C.bool(abc) D.divmod(6,0) 第 2 题 单选题 下列python代码的…

钉钉与金蝶云星空数据集成:提高企业付款申请单处理效率

钉钉数据集成到金蝶云星空&#xff1a;付款申请单的自动下推生成 在企业日常运营中&#xff0c;如何高效地管理和处理付款申请单是一个关键问题。为了提升这一流程的效率&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉中的付款申请单数据无缝对接到金蝶云星空系…

Spring Boot助力的厨艺互动平台开发指南

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…

代码学习:如何阅读开源代码

如何阅读开源代码 准备 目的&#xff1a;学习代码&#xff0c;代码添加新功能、旧代码重构知识准备&#xff1a;技术基础、编程基础、文档开发环境&#xff1a;依赖环境及操作系统笔记&#xff1a;添加代码注释及重要思路记录文档 实操 阅读项目Readme.md&#xff1a;大致了…

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…

软考:CORBA架构

CORBA过时了吗 CORBA指南 个人小结&#xff1a; IPC&#xff0c;进程间通信&#xff0c;Socket应用在不同机器之间的通信 RPC是一种技术思想而非一种规范 但站在八九十年代的当口&#xff0c;简单来说&#xff0c;就是我在本地调用了一个函数&#xff0c;或者对象的方法&…

沧穹科技室内音频“北斗”定位技术亮相第三届北斗规模应用国际峰会

10月24日-28日&#xff0c;由国家发展改革委、国家网信办、交通运输部、湖南省人民政府共同主办的第三届北斗规模应用国际峰会于株洲国际会展中心隆重开幕。沧穹科技总经理戴坚先生受邀出席开幕式&#xff0c;公司自研室内音频“北斗”定位产品亮相北斗规模应用示范场景区。 峰…

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露&#xff0c;可以记录一下&#xff0c;涉及的知识点比较多 打开环境 查看源码&#xff0c; 第一段flag 乱码&#xff0c;恢复一下 乱码恢复网站&#xff1a;乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

Pytest-Bdd-Playwright 系列教程(2):支持在多浏览器、多环境中执行测试

Pytest-Bdd-Playwright 系列教程&#xff08;2&#xff09;&#xff1a;支持在多浏览器、多环境中执行测试 前言一、 修改 conftest.py 文件二、创建配置文件三、修改search_steps.py文件四、运行测试总结 前言 本文教程知识点&#xff1a; 支持在多浏览器、多环境中执行测试 …

【ROS概述】C++运行hello world

Python和C通用步骤&#xff1a; 一、创建工作空间并初始化 1、新建工作空间&#xff08;work space&#xff09;——使用终端&#xff08;ctrlaltT&#xff09; mkdir -p 空间名称/src 2、进入工作空间 cd 空间名称 可以在文件里看到同步变化&#xff0c;并且demo01_ws文…

SpringBoot项目上高并发问题的解决方案

案例&#xff1a;多个用户同时购买数量为1的商品&#xff0c;所以只能有一个购买成功 不加锁 会重复购买 乐观锁&#xff0c;加字段处理&#xff0c;在并发少的时候可以使用 加版本号字段&#xff0c;第一次查询数量的时候读取到版本号&#xff0c;更新数量时用同样的版本号更新…