1. 为什么选择C语言操作Kafka?
在分布式系统领域,Kafka作为高吞吐量的消息队列系统早已成为基础设施级别的组件。而C语言这种"古老"但高效的编程语言,依然在嵌入式系统、高频交易、网络设备等对性能有极致要求的场景中占据统治地位。当需要在这些场景中集成Kafka时,librdkafka这个用C编写的原生客户端库就成了不二之选。
我最初接触这个组合是在开发网络探针项目时——需要实时处理每秒百万级的网络流量数据,并将元数据推送到Kafka集群。用Java客户端虽然简单,但GC停顿和内存开销成为瓶颈。切换到librdkafka后,不仅吞吐量提升了3倍,内存占用也下降了60%。
2. 环境准备与librdkafka安装
2.1 开发环境配置
在Ubuntu 20.04上配置开发环境最省心(Windows用户建议使用WSL2):
bash复制# 安装编译工具链
sudo apt update && sudo apt install -y build-essential cmake git
# 安装Kafka依赖的SSL/SASL库
sudo apt install -y libssl-dev libsasl2-dev
注意:生产环境强烈建议启用SSL加密和SASL认证,即使是在内网环境。我见过太多因为偷懒没配安全机制导致的数据泄露案例。
2.2 源码编译librdkafka
官方预编译的二进制版本可能缺少某些特性,推荐从源码编译:
bash复制git clone https://github.com/edenhill/librdkafka.git
cd librdkafka
./configure --prefix=/usr/local --enable-sasl --enable-ssl
make -j$(nproc)
sudo make install
关键编译选项说明:
--enable-sasl:启用Kerberos/SCRAM认证支持--enable-ssl:启用TLS加密传输--enable-lz4:如果需要LZ4压缩需要单独开启
验证安装是否成功:
bash复制pkg-config --modversion rdkafka
# 应该输出类似1.8.2的版本号
3. 生产者开发实战
3.1 基础生产者实现
先看一个最小化的生产者示例(producer.c):
c复制#include <librdkafka/rdkafka.h>
#include <stdio.h>
void dr_msg_cb(rd_kafka_t *rk,
const rd_kafka_message_t *rkmessage,
void *opaque) {
if (rkmessage->err)
fprintf(stderr, "Message delivery failed: %s\n",
rd_kafka_err2str(rkmessage->err));
}
int main() {
rd_kafka_conf_t *conf = rd_kafka_conf_new();
// 基础配置
rd_kafka_conf_set(conf, "bootstrap.servers", "localhost:9092", NULL, 0);
rd_kafka_conf_set(conf, "message.timeout.ms", "5000", NULL, 0);
rd_kafka_conf_set_dr_msg_cb(conf, dr_msg_cb);
// 创建生产者实例
rd_kafka_t *producer = rd_kafka_new(RD_KAFKA_PRODUCER, conf, NULL, 0);
// 发送消息
const char *topic = "test_topic";
const char *payload = "Hello Kafka from C!";
rd_kafka_produce(
rd_kafka_topic_new(producer, topic, NULL),
RD_KA
