【C/C++】從零開始掌握Kafka

文章目錄

  • 從零開始掌握Kafka
    • 一、Kafka 基礎知識理解(理論)
      • 1. 核心組件與架構
      • 2. 重點概念解析
    • 二、Kafka 面試重點知識梳理
    • 三、C++ 使用 Kafka 的實踐(librdkafka)
      • 1. librdkafka 簡介
      • 2. 安裝 librdkafka
    • 四、實戰:高吞吐生產者與消費者
      • 1. 生產者示例(Producer.cpp)
      • 2. 消費者示例(Consumer.cpp)
    • 五、Kafka 開發相關 C++ 能力要求
      • 必備 C++ 能力
      • 推薦工具鏈
    • 六、項目實踐建議
      • 1. 項目目標
      • 2. 模塊設計建議
    • 七、推薦資料與開源項目

從零開始掌握Kafka

一、Kafka 基礎知識理解(理論)

1. 核心組件與架構

組件作用
BrokerKafka 節點,負責存儲消息
Topic消息主題,邏輯上的分類
Partition一個 Topic 的分片,支持并發與擴展性
Producer負責發送消息
Consumer負責消費消息
Consumer Group多消費者協作消費
Zookeeper / KRaft負責元數據與協調(未來版本轉向 KRaft 模式)

2. 重點概念解析

  • Partition:分片,支持水平擴展(每個 partition 是一個有序日志)。

  • 副本機制(Replication):每個 Partition 有一個 leader + N 個 follower,保證高可用。

  • 消費者組(Consumer Group):Kafka 實現廣播和負載均衡消費的機制。

  • offset 管理

    • 自動提交(enable.auto.commit)
    • 手動提交(commitSync / commitAsync)
    • Kafka 默認 offset 存在 __consumer_offsets topic 中。

二、Kafka 面試重點知識梳理

面試點說明
消息順序性同一個 partition 內有順序,跨 partition 無法保證
冪等性生產使用 enable.idempotence=true,避免 producer 重試造成重復發送
分布式一致性ISR 機制,消息寫入需同步到 follower;ACK=all 實現強一致
消費位點提交手動提交 offset 是保證消費語義精確一次的關鍵
Rebalance 原理消費者上下線會觸發 Rebalance,導致 partition 分配變化

三、C++ 使用 Kafka 的實踐(librdkafka)

1. librdkafka 簡介

  • 官方提供的高性能 C/C++ Kafka 客戶端庫。

  • GitHub 地址:https://github.com/edenhill/librdkafka

  • 支持:

    • 高吞吐的生產與消費
    • offset 提交
    • topic/partition 管理
    • 冪等發送、壓縮、批處理

2. 安裝 librdkafka

# Ubuntu
sudo apt-get install librdkafka-dev# Or from source
git clone https://github.com/edenhill/librdkafka.git
cd librdkafka
./configure
make
sudo make install

四、實戰:高吞吐生產者與消費者

1. 生產者示例(Producer.cpp)

#include <librdkafka/rdkafkacpp.h>class ExampleDeliveryReportCb : public RdKafka::DeliveryReportCb {
public:void dr_cb(RdKafka::Message &message) override {if (message.err()) {std::cerr << "Delivery failed: " << message.errstr() << std::endl;} else {std::cout << "Delivered message to " << message.topic_name()<< " [" << message.partition() << "] at offset "<< message.offset() << std::endl;}}
};int main() {std::string errstr;std::string topic = "test_topic";RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);conf->set("bootstrap.servers", "localhost:9092", errstr);ExampleDeliveryReportCb dr_cb;conf->set("dr_cb", &dr_cb, errstr);RdKafka::Producer *producer = RdKafka::Producer::create(conf, errstr);delete conf;for (int i = 0; i < 10000; ++i) {std::string message = "Message " + std::to_string(i);producer->produce(topic, RdKafka::Topic::PARTITION_UA,RdKafka::Producer::RK_MSG_COPY,const_cast<char *>(message.c_str()), message.size(),nullptr, 0, 0, nullptr);producer->poll(0); // 異步發送需要poll觸發回調}producer->flush(10000); // 等待所有消息發送完成delete producer;
}

2. 消費者示例(Consumer.cpp)

#include <librdkafka/rdkafkacpp.h>int main() {std::string errstr;RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);conf->set("bootstrap.servers", "localhost:9092", errstr);conf->set("group.id", "my_group", errstr);conf->set("enable.auto.commit", "false", errstr); // 手動提交RdKafka::KafkaConsumer *consumer = RdKafka::KafkaConsumer::create(conf, errstr);delete conf;std::vector<std::string> topics = {"test_topic"};consumer->subscribe(topics);while (true) {RdKafka::Message *msg = consumer->consume(1000);switch (msg->err()) {case RdKafka::ERR_NO_ERROR:std::cout << "Read msg at offset " << msg->offset()<< ": " << static_cast<const char *>(msg->payload()) << std::endl;consumer->commitAsync(msg);  // 或 commitSync(msg)break;case RdKafka::ERR__TIMED_OUT:break;default:std::cerr << "Error: " << msg->errstr() << std::endl;}delete msg;}consumer->close();delete consumer;
}

五、Kafka 開發相關 C++ 能力要求

必備 C++ 能力

  • 熟練使用 RAII、智能指針、異常處理
  • 理解線程安全、異步模型(poll, callback)
  • 能夠結合 JSON/XML 配置 Kafka 客戶端
  • 編寫模塊化、高性能的消息收發組件

推薦工具鏈

  • 構建系統:CMake
  • 日志:spdlog 或 glog
  • 單元測試:gtest
  • JSON:nlohmann/json

六、項目實踐建議

1. 項目目標

構建一個 C++ Kafka 模塊,支持:

  • 高吞吐量生產(批量發送,壓縮)
  • 冪等性保障
  • 多線程消費 + 位點提交策略
  • 簡單的失敗重試機制
  • 支持 JSON 格式的序列化消息

2. 模塊設計建議

模塊功能
KafkaProducer封裝 Producer 初始化/發送邏輯
KafkaConsumer封裝 Consumer + offset 管理
ConfigManager讀取配置
Message消息封裝與解析(支持 JSON)

七、推薦資料與開源項目

  • 📚 Kafka 權威指南(原書第2版)

  • 📘 librdkafka 文檔

  • 📖 Apache Kafka 官方文檔

  • 💻 開源項目參考:

    • confluent-kafka-cpp
    • cppkafka(封裝更現代 C++)

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

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

相關文章

Spyglass:目標文件(.spq)的結構

相關閱讀 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 預備知識 為了方便檢查&#xff0c;Spyglass向用戶提供Guideware作為檢查參考&#xff1b;Guideware又包含各種方法(Methodology)&#xff0c;應用于設計的不同階段&…

一些Dify聊天系統組件流程圖架構圖

分享一些有助于深入理解Dify聊天模塊的架構圖 整體組件架構圖 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…

地理空間索引:解鎖日志分析中的位置智慧

title: 地理空間索引:解鎖日志分析中的位置智慧 date: 2025/05/24 18:43:06 updated: 2025/05/24 18:43:06 author: cmdragon excerpt: 地理空間索引在日志分析中應用廣泛,涉及用戶登錄IP定位、移動端位置軌跡和物聯網設備位置上報等場景。MongoDB支持2dsphere和2d兩種地理…

分庫分表深度解析

一、為什么要分庫分表&#xff1f; 通常&#xff0c;數據庫性能受到如下幾個限制&#xff1a; 硬件瓶頸&#xff1a;單機的 CPU、內存、磁盤 I/O 等資源總是有限。例如&#xff0c;當單表中的記錄達到上億、甚至更高時&#xff0c;表掃描、索引維護和數據遷移會變得非常慢。單…

QListWidget的函數,信號介紹

前言 Qt版本:6.8.0 該類用于列表模型/視圖 QListWidgetItem函數介紹 作用 QListWidget是Qt框架中用于管理可交互列表項的核心組件&#xff0c;主要作用包括&#xff1a; 列表項管理 支持動態添加/刪除項&#xff1a;addItem(), takeItem()批量操作&#xff1a;addItems()…

ModbusRTU轉profibusDP網關與RAC400通訊報文解析

ModbusRTU轉profibusDP網關與RAC400通訊報文解析 在工業自動化領域&#xff0c;ModbusRTU和ProfibusDP是兩種常見的通信協議。ModbusRTU以其簡單、可靠、易于實現等特點&#xff0c;廣泛應用于各種工業設備之間的通信&#xff1b;而ProfibusDP則是一種高性能的現場總線標準&am…

Python容器

一、容器 1. 列表【】&#xff1a;有序可重復可混裝可修改 [元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;...] ? 可以容納多個元素 ? 可以容納不同類型的元素&#xff08;混裝&#xff09; ? 數據是有序存儲的&#xff08;有下標序號&#xff09; ? 允許重復數…

webpack面試問題

一、核心概念 Webpack的構建流程是什么? 答案: 初始化:讀取配置,創建Compiler對象編譯:從入口文件開始,遞歸分析依賴關系,生成依賴圖模塊處理:調用Loader轉換模塊(如babel-loader)輸出:將處理后的模塊組合成Chunk,生成最終文件Loader和Plugin的區別? Loader:文件…

uniapp-商城-66-shop(2-品牌信息顯示,數據庫讀取的異步操作 放到vuex actions)

完成頁面的顯示&#xff0c;但是還需要進行修改&#xff0c;這里涉及到修改中的信息同步顯示。也會涉及到數據的讀取&#xff0c;修改和同步。 本文介紹了如何使用Vuex管理品牌數據&#xff0c;實現數據的同步顯示和修改。主要內容包括&#xff1a;1.將獲取品牌數據的異步操作封…

使用Pyinstaller打包python,全過程解析【2025最詳細】

一、如何使用 Pyinstaller 打包 Python 程序 1.打開終端 右鍵點擊文件夾空白處&#xff0c;選擇 打開于 > 打開終端 2.安裝 pyinstaller 在打開的終端中&#xff0c;輸入命令【pip install pyinstaller】 使用 Python 包管理工具 pip 來安裝 Pyinstaller。等待安裝過程結…

GPU加速Kubernetes集群助力音視頻轉碼與AI工作負載擴展

容器編排與GPU計算的結合&#xff0c;為追求性能優化的企業開辟了戰略轉型的新路徑 基于GPU的托管Kubernetes集群不僅是技術選擇&#xff0c;更是徹底改變企業處理高負載任務的戰略部署方式。 隨著人工智能和機器學習項目激增、實時數據處理需求的劇增&#xff0c;以及高性能媒…

LINUX 524 rsync+inotify 調試(問題1:指定端口無法同步/已通過;問題2:rsync.log文件中時間不顯示/已顯示)

怎么把java文件夾給傳過去了 rsync inotify 監控代碼實時傳輸調試 沒看到日志 這里面有了 rsync -e"ssh -p 3712" -av /root/app/java/ code192.168.235.100:/home/code/backup/java_backup/ 文件夾后面的/要加上 [rootlocalhost java]# cat /var/log/rsync.log…

Python入門手冊:條件判斷

條件判斷是編程中不可或缺的一部分&#xff0c;它允許程序根據不同的條件執行不同的代碼塊。Python提供了if、elif和else語句來實現條件判斷。通過這些語句&#xff0c;你可以控制程序的流程&#xff0c;使其能夠根據不同的情況做出相應的反應。本文將詳細介紹Python中的條件判…

x-cmd install | cargo-selector:優雅管理 Rust 項目二進制與示例,開發體驗升級

目錄 功能亮點安裝優勢特點適用場景總結 還在為 Rust 項目中眾多的二進制文件和示例而煩惱嗎&#xff1f;cargo-selector 讓你告別繁瑣的命令行&#xff0c;輕松選擇并運行目標程序&#xff01; 功能亮點 交互式選擇&#xff1a; 在終端中以交互方式瀏覽你的二進制文件和示例&…

Baklib知識中臺高效實踐路徑

知識中臺全周期構建路徑 Baklib在構建知識中臺全周期管理體系時&#xff0c;以知識價值轉化為核心導向&#xff0c;通過三階段遞進實現閉環運作。在知識采集階段&#xff0c;運用智能爬蟲與API接口技術&#xff0c;聚合分散在業務系統、文檔庫及溝通工具中的碎片化知識資產&am…

mapbox進階,手寫放大鏡功能

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.1 ??mapboxgl.Map style屬性二、??手寫放大鏡功能1. ??實現思路2. ??…

康佳Java開發面試題及參考答案

面向對象三大特性是什么&#xff1f;請舉例說明多態。 面向對象編程&#xff08;OOP&#xff09;的三大核心特性是封裝、繼承和多態。封裝是將數據和操作數據的方法綁定在一起&#xff0c;并隱藏對象的內部實現細節&#xff1b;繼承允許一個類繼承另一個類的屬性和方法&#x…

Spark集群架構解析:核心組件與Standalone、YARN模式深度對比(AM,Container,Driver,Executor)

一、核心組件定義與關系拆解 1. ApplicationMaster&#xff08;AM&#xff09; 定義&#xff1a;YARN 框架中的應用管理器&#xff0c;每個應用程序&#xff08;如 Spark 作業&#xff09;對應一個 AM。職責&#xff1a; 向 YARN 的 ResourceManager 申請資源&#xff08;Con…

IS-IS報文

前言&#xff1a; IS-IS采用分層架構&#xff0c;所有Level-2和Level 1-2路由器構成了骨干區域&#xff0c;同一區域的Level-1路由器構成了普通區域IS-IS支持三種認證方式&#xff0c;分別是接口認證、區域認證、路由域認證IS-IS有四種報文類型&#xff0c;分別是IIH、CSNP、P…

【Flutter】多語言適配-波斯語RTL從右到左

前言 在多語言適配的時候&#xff0c;波斯語的顯示是從右到左的&#xff0c;需要針對一些控件進行單獨適配。 核心邏輯&#xff1a;根據語言動態設置 Directionality Widget build(BuildContext context) {final isRtl Localizations.localeOf(context).languageCode fa;r…