文章目錄
- 從零開始掌握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. 核心組件與架構
組件 | 作用 |
---|---|
Broker | Kafka 節點,負責存儲消息 |
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++)