基于librdkafka開發的C++客戶端,生產者生產發送數據失敗問題處理

在這里插入圖片描述
我們的項目使用了開源的librdkafka庫,實現向kafka服務器生產發送數據的功能。使用的librdkafka的版本是1.9.0。

作為客戶端程序,在開發時和客戶協商確認后,支持了SASL_PLAINTEXT認證。以下概念解釋引用自通義千問AI

SASL (Simple Authentication and Security Layer) 是一種框架,允許服務添加認證支持。
Kafka 支持多種 SASL 機制,其中之一就是 PLAINTEXT。
盡管名稱中有“PLAINTEXT”,它實際上指的是使用的認證機制(即明文傳輸用戶名和密碼),而不是數據傳輸的安全性。
為了安全起見,通常會結合 SSL/TLS 來加密通信。主要用途:
用戶身份驗證:確認嘗試連接到 Kafka 集群的客戶端確實是其所聲稱的身份。
安全性:雖然 PLAINTEXT 機制本身不提供加密,但它可以與 SSL/TLS 結合使用以確保數據傳輸的安全性。

kafka服務端(github上下載kafka源碼后安裝)如何配置:
在 server.properties 文件中啟用 SASL 和指定機制:
listeners=SASL_PLAINTEXT://your.host.name:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

依賴librdkafka實現的C++客戶端的偽代碼設置如下

bool KafkaProducer::init(std::string &brokers, const string &username , const string &passwd, const bool &async, const int &size)
{...if (!username.empty() && !passwd.empty()){HLog(HGET_INFO << L"sasl authentication set, username:" << username << L" ,password:" << passwd);//security.protocol: 安全協議類型,示例為SASL_PLAINTEXTconf_->set("security.protocol", "sasl_plaintext", errstr);//sasl.mechanisms : sasl協議機制,示例為PLAIN, 表示普通文本conf_->set("sasl.mechanisms", "PLAIN", errstr);//sasl.username : 認證用戶名conf_->set("sasl.username", username, errstr);//sasl.password : 認證密碼		conf_->set("sasl.password", passwd, errstr);}}else{conf_->set("producer.type", "sync", errstr);}...
}

以下概念解釋也是來自于通義千問AI

ACLs(Access Control Lists,訪問控制列表) 是 Kafka 提供的一種方法,用于控制哪些用戶或客戶端可以對特定資源執行操作。ACL 定義了誰(principal)、可以在哪個資源上(resource)、執行什么操作(operation)。這里的資源可以是主題、消費者組等。ACL 組成部分
Principal:表示用戶身份,通常格式為 User:<username>。
Resource Type:要控制訪問權限的資源類型,如 Topic, Group, Cluster, TransactionalId。
Operation:允許的操作類型,包括但不限于 Read, Write, Create, Delete, Describe, Alter, All。
Pattern Type:資源匹配模式,支持 Literal(精確匹配),Prefixed(前綴匹配)等。
Host:指定允許從哪些主機發起請求,默認為 * 表示不限制
要啟用 ACL 支持,你需要在 Kafka broker 的配置文件 server.properties 中設置以下參數:authorizer.class.name默認情況下,Kafka 使用簡單的基于 Zookeeper 的 ACL 管理方式。為了啟用 ACL 支持,你需要指定一個授權器類。最常用的授權器是 kafka.security.auth.SimpleAclAuthorizer。
authorizer.class.name=kafka.security.authorizer.AclAuthorizer下面是開啟了ACL后的相關設置示例,允許某個用戶讀寫某個topic
(1)查看:在kafka-acls.sh腳本中傳入list參數來查看ACL授權
./kafka-acls.sh --list --authorizer-properties zookeeper.connect=localhost:2181(2)配置ACL來讓writer用戶有權限寫入test這個topic
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:writer --operation Write --topic test(3)為reader用戶設置test topic的讀權限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:reader --operation Read --topic test(4)設置訪問group的權限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:reader --operation Read --group test-group

問題1:
某天客戶反饋kafka服務器收不到數據了,我們拿回了日志。發現了日志中報錯
[1][2025-06-24][11:57:03][T2709509888][KafkaProducer.cpp ][0111][I]Kafka produce failed:Broker: Topic authorization failed .Message:{"db_name":"UniMonDB","dtagentpackagecusttime":"2023-11-03 13:29:23.0000","dtdevdowntime":"2025-06-17 15:11:49.0000","dtdevfirstfoundtime":"2024-02-20 15:47:47.0000","dtdevlastofftime":0,"dtdevstarttime":"2025-06-12 18:06:00.0000","dtdevuptime":"2025-06-24 12:41:28.0000","dtfoundlongtermnotrunningtime":"0-00-00 00:00:00.0000","dtlasttimeofuaagentdown":"2025-06-23 16:14:26.0000","dtpwdlastset":"0-00-00 00:00:00.0000","dttimeout":"0-00-00 00:00:00.0000","iagentpackagetype":64,"iagenttype":2,"iconnifno":39,"idatacollectby":0,"idevrecordid":71,"idevscrappedstatus":0,"idevtype":10,"idevtypeusedbytopo":0,"idot1xver":1,"iencryptstatus":0,"iextenstatus":0,"igetstatus":1,"ihastag":0,"iisaddedbyclient":0,"iisattrsetbyclient":0,"iisbelongtounit":1,"iisbind":0,"iisdevtypesetbyclient":0,"iisfoundbytopo":0,"iishidden":0,"iisinad":0,"iisiot":0,"iislongtermnotrunning":0,"imanuldept":0,"imultios":1,"inetdisposalstatus":0,"iregisterresult":0,"iroamingdevice":0,"isafescore":0,"iselfcheckscore":100,"isnmpagentstatus":0,"isolation":0,"istatus":1,"isysservices":0,"iuniaccessagentoldstatus":2,"iuniaccessagentstatus":1,"ivalnformat":0,"recycledstatus":0,"source_ip":"99.96.0.81","stradaccount":"","stragentpackagename":"V10820-20231103(辦公網版)","strassetid":"","strbaiduloc":"","strbelong":"","strbelongdeptid":"","strclientappid":"","strconnifname":"GigabitEthernet0/0/34","strconnswitchname":"SYD-OA-S5720-02","strdevalias":"","strdevdesc":"","strdevgip":"99.96.16.187","strdevidentiy":"DC8531FB-22E0-468B-ABD5-AD6B1E53AB9F","strdevip":"99.96.16.187","strdevname":"ASDO-CBMF.sydney.cmbchina.cn","strdevoid":"","strdomain":"sydney.cmbchina.cn","stremailaccount":"","strextend":"","strgpsx":"","strgpsy":"","strip1":"099096016187","strlocation":"","strmac":"7C:57:58:10:5F:14","strnatip":"99.96.16.187","strnatip1":"","strnet":"99.96.16.0/24","strreportlink":"/notifymsg/devreport/7cda64088ed3d9ed33cb37f06953c22d.html","strres1":"","strres2":"","strsafeclass":"","strservices":"","strverofuaagent":"3.5.10820.3","strxloc":"","stryloc":"","table_name":"tbl_devbaseinfo","uidconnswitchid":"68EFEC46-C6F9-435A-8AAA-566E42E78000","uiddeptid":"8b4e251a-0560-44cb-98b5-49bbb5add077","uiddevrecordid":"DC8531FB-22E0-468B-ABD5-AD6B1E53AB9F","uiddomainid":"SL832322282903524504","uiduserid":"50381d22-ecaa-4ed5-b3e2-4120b77673d8"}

根據這個日志,找到對應的代碼,可以知道第三方庫報錯的其實是”Broker: Topic authorization failed “

RdKafka::ErrorCode resp = producer_->produce(tpk, partition,RdKafka::Producer::RK_MSG_COPY,const_cast<char *>(data), size,key.c_str(), key.size(), NULL);if (resp != RdKafka::ERR_NO_ERROR){HString strLog;strLog << L"Kafka produce failed:" << HString(RdKafka::err2str(resp)) << L" .Message:" << HString(data);HASGlobal::pins()->mpFail->log(HASGlobal::pins()->mpFail->get(LEL_TIPS, __WFILE__, __LINE__) << strLog);...}

認證失敗的報錯,由此想到可能是客戶端和服務端關于SASL認證的相關配置是否有差異造成。或者是開啟了ACL,但是沒有為這個用戶開放寫topic的權限

要求用戶提供kafka服務端SASL的相關配置,和客戶端核對無誤后,要求客戶運維和客戶的開發溝通排查是否是ACL的相關權限問題導致,最終客戶運維反饋是客戶的開發同事沒有為這個用戶配置對于這個topic的寫權限,導致客戶端生產數據傳給客戶的kafka服務器的某個topic時,報錯”Broker: Topic authorization failed“,在添加了配置后,生產者的數據可正常寫入。

問題2:
客戶端程序使用./手動執行后,有如下報錯。
需要在/etc/hosts 文件中加上kafka服務器ip和主機名的對應關系。添加配置后可以客戶端可以正常生產發送數據到kafka服務器
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912474.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenGL之yaw、pitch、fov 和 lookAt

在 3D 圖形學中&#xff0c;yaw、pitch、fov 和 lookAt 都是控制攝像機&#xff08;Camera&#xff09;行為的關鍵參數&#xff0c;但它們的 作用層級 和 使用場景 不同。 1. yaw、pitch、fov 的作用 (1) yaw&#xff08;偏航角&#xff09; 作用&#xff1a;控制攝像機 左右…

STM32-第一節-新建工程,GPIO,點亮LED,蜂鳴器

一、新建工程&#xff1a; 1.Keil中新建工程&#xff0c;選擇開發板型號。 2.工程文件夾建立Start&#xff0c;Library等分類&#xff0c;復制模版工程中的文件到工程文件夾中。 3.在Keil中添加分組&#xff0c;添加文件。 4.工程選項設置&#xff1a; c/c中&#xff1a;Inc…

Rust標量、復合類型與自定義類型、第三方并發結構

以下是 Rust 中標量類型、對象類型&#xff08;含結構體、復合類型、堆分配類型&#xff09;以及常用第三方并發數據結構的完整分類、示例和區別對比&#xff0c;幫助你系統掌握它們的本質異同&#xff1a; &#x1f7e2; 一、標量類型&#xff08;Scalar Types&#xff0c;存儲…

基于STM32溫濕度檢測—串口顯示

基于STM32溫濕度檢測 &#xff08;仿真&#xff0b;程序&#xff09; 功能介紹 具體功能&#xff1a; 1.使用DHT11檢測溫濕度&#xff1b; 2.單片機處理完控制LCD1602顯示溫濕度&#xff1b; 3.單片機也通過串口顯示檢測到的溫濕度&#xff1b; 添加圖片注釋&#xff0c;不…

Windows 10 查詢 Nginx 進程教程

1. 打開命令提示符&#xff08;CMD&#xff09; 按 Win R&#xff0c;輸入 cmd&#xff0c;回車。或者在開始菜單搜索欄輸入“cmd”&#xff0c;選擇“命令提示符”。 2. 查看是否有正在運行的 Nginx 進程 輸入命令&#xff1a; tasklist | findstr nginx這個命令會列出所有…

使用 Kafka 優化物流系統的實踐與思考

使用 Kafka 優化物流系統的實踐與思考 在現代物流系統中&#xff0c;訂單處理、倉儲管理、運輸調度等環節復雜且實時性要求高。為了滿足異步解耦、高吞吐、高可用、事件驅動和數據可靠性等需求&#xff0c;Kafka 作為分布式消息隊列和流處理平臺&#xff0c;成為了我們的首選。…

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你問得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一種模式匹配寫法&#xff0c;它用于從 Option 類型中提取值。 ? 背景知識&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一個值可能存在也可能不存在&#xff0c;就會用 Option…

什么是LLM大語言模型

什么是LLM大語言模型 LLM的全稱是&#xff0c;Large Language Model&#xff0c;簡稱LLM&#xff0c;翻譯為大語言模型&#xff0c;其核心是模擬人類語言的復雜規律&#xff0c;實現語義理解、推理分析、文本生成等任務&#xff0c;主要目的是實現能讀懂和說出人類語言的模型。…

雜談-架構時代演進

關于未來 5-10 年軟件系統演化方向 1. 云原生 ? 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平臺自治化&#xff1a; K8s Operator 日益強大&#xff0c;逐步具備自愈、自動擴縮容、自動調優能力。 云廠商與企業私有云逐步融合為一體…

如何查看服務器的運行日志?

&#x1f7e2; 一、Linux服務器 Linux日志都在**/var/log**目錄下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件內容/var/log/messages大部分系統日志&#xff08;CentOS常見&#xff09;/var/log/syslog系統消息日志&#xff08;Ubuntu/Debian常見&a…

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫 編譯環境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go語言中map[string]interface{} 和 map[string]string的區別

在 Go 語言中&#xff0c;map[string]interface{} 和 map[string]string 是兩種不同類型的 map&#xff0c;它們的主要區別在于值的類型以及這種差異帶來的使用場景和靈活性的不同。 1. 值的類型 map[string]interface{}&#xff1a;這里的 interface{} 表示 Go 中的空接口類型…

AdGuard Home 安裝及使用

AdGuard Home 是 AdGuard 開源的一個私人 DNS 服務端,只需在網關部署,即可實現全局域網的廣告攔截與隱私反追蹤。在 DNS 解析的過程中,匹配規則庫內的 URL 進行攔截,同時在客戶端中,還可以通過自定義過濾規則實現網頁 DOM 的攔截。 基于 Golang 編寫的 AdGuard Home,官方…

繞過 GraphQL 暴力破解保護

題目要求&#xff1a; 本實驗的用戶登錄機制由 GraphQL API 提供支持。API 終端節點有一個速率限制器&#xff0c;如果它在短時間內收到來自同一源的太多請求&#xff0c;則會返回錯誤。 要解決實驗問題&#xff0c;請暴力破解登錄機制以 .使用身份驗證實驗室密碼列表作為密碼…

C/C++ 使用rapidjson庫 操作Json格式文件(創建、插入、解析、修改、刪除)

目錄 一、前言 1.簡介 2.兼容性 3.下載 4.安裝 5.官方文檔 6.自述 二、封裝Json 1. 創建一個 Document 對象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 將Document轉換為字符串…

免安裝一鍵修復網絡診斷 + 權限修復!打印機共享錯誤工具適配 Win7/10/11

各位打印小能手們&#xff01;你們有沒有遇到過共享打印機出問題&#xff0c;搞得自己焦頭爛額的情況&#xff1f;比如系統一更新&#xff0c;打印機就連不上&#xff0c;打印任務失敗&#xff0c;真的是讓人崩潰啊&#xff01;別慌&#xff0c;今天就給大家全面介紹一款打印機…

電腦分屏快捷鍵5

按window右箭頭&#xff1a; 按window左箭頭&#xff1a;

nt!CcFlushCache函數分析之nt!CcFindBcb

nt!CcFindBcb函數分析 第一部分&#xff1a; 1: kd> p nt!CcAcquireByteRangeForWrite0x377: 80a13c49 e866e4ffff call nt!CcFindBcb (80a120b4) 1: kd> t nt!CcFindBcb: 80a120b4 55 push ebp 1: kd> kc # 00 nt!CcFindBcb 01 nt!CcAcqu…

矩陣及矩陣快速冪

一.矩陣與模板 【模板】矩陣求和 時間限制&#xff1a;1秒 內存限制&#xff1a;128M 題目描述 給出兩個&#x1d45b;行&#x1d45a;列的矩陣&#xff0c;求兩個矩陣的和 輸入描述 第一行輸入兩個以空格分隔的整數&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588獲取探維雷達數據

可以在上期部署完 FASTLIO 的工作空間內&#xff0c;繼續部署探維雷達的驅動程序。不要問為什么不用 mid360&#xff0c;因為我手上只有探維雷達。 探維雷達的驅動鏈接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下載驅動并編譯 因為沿…