【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…