librdkafka的使用和介绍

11 篇文章 0 订阅
3 篇文章 0 订阅

librdkafka的使用介绍

librdkafkakafkac语言接口

 

下面简单的介绍一下其接口

    1、rd_kafka_conf_set设置全局配置

    2、rd_kafka_topic_conf_set设置topic配置

    3、rd_kafka_brokers_add设置broker地址,启动向broker发送消息的线程

    4、rd_kafka_new启动kafka主线程

    5、rd_kafka_topic_new建topic

   6、rd_kafka_produce使用本函数发送消息

    7、rd_kafka_poll调用回调函数

根据其github上的example我简单的封装一下producerhttps://github.com/edenhill/librdkafka

编译静态:把上面的地中的代码下载到你的linux系统中

接下来就是传统的三部安装方法:

./configure

make

make install

编译好的静态和动态在src以及src-cpp目录下,我这里使用的是src目录下librdkafka.a  rdkafka.h  你也可以使用动态库 都是一样的 注意头文件的路径-I跟上头文件路径,我这里把静态库和头文件都是放在当前目录下  所以写 -I./

编译方法:g++ kafka_producer.cpp -o testkafka -I./ -lcurl  librdkafka.a -lpthread -lrt

写成c++的接口

#include <ctype.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <syslog.h>
#include <sys/time.h>
#include <errno.h>

#include "rdkafka.h"

const int PRODUCER_INIT_FAILED = -1;
const int PRODUCER_INIT_SUCCESS = 0;
const int PUSH_DATA_FAILED = -1;
const int PUSH_DATA_SUCCESS = 0;


static void logger(const rd_kafka_t *rk, int level,const char *fac, const char *buf) 
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    fprintf(stderr, "%u.%03u RDKAFKA-%i-%s: %s: %s\n",
        (int)tv.tv_sec, (int)(tv.tv_usec / 1000),
        level, fac, rk ? rd_kafka_name(rk) : NULL, buf);
}


class ProducerKafka
{
public:
	ProducerKafka(){};
	~ProducerKafka(){}

	int init_kafka(int partition, char *brokers, char *topic);
	int push_data_to_kafka(const char* buf, const int buf_len);
    void destroy();

private:
	int partition_;	
	
	//rd
	rd_kafka_t* handler_;
	rd_kafka_conf_t *conf_;
	
	//topic
	rd_kafka_topic_t *topic_;
	rd_kafka_topic_conf_t *topic_conf_;
};

int ProducerKafka::init_kafka(int partition, char *brokers, char *topic)
{
	char tmp[16]={0};
	char errstr[512]={0};	

	partition_ = partition;	

	/* Kafka configuration */
    conf_ = rd_kafka_conf_new();
	
	//set logger :register log function
	rd_kafka_conf_set_log_cb(conf_, logger);	
	
	/* Quick termination */
    snprintf(tmp, sizeof(tmp), "%i", SIGIO);
    rd_kafka_conf_set(conf_, "internal.termination.signal", tmp, NULL, 0);

	/*topic configuration*/
	topic_conf_ = rd_kafka_topic_conf_new();

	if (!(handler_  = rd_kafka_new(RD_KAFKA_PRODUCER, conf_, errstr, sizeof(errstr)))) 
	{
		fprintf(stderr, "*****Failed to create new producer: %s*******\n",errstr);
		return PRODUCER_INIT_FAILED;
	}

	rd_kafka_set_log_level(handler_, LOG_DEBUG);

	/* Add brokers */
    if (rd_kafka_brokers_add(handler_, brokers) == 0)
    {
        fprintf(stderr, "****** No valid brokers specified********\n");
 		return PRODUCER_INIT_FAILED;       
    }	
	

	/* Create topic */
    topic_ = rd_kafka_topic_new(handler_, topic, topic_conf_);
	
	return PRODUCER_INIT_SUCCESS;
}

void ProducerKafka::destroy()
{
	/* Destroy topic */
    rd_kafka_topic_destroy(topic_);

    /* Destroy the handle */
    rd_kafka_destroy(handler_);
}

int ProducerKafka::push_data_to_kafka(const char* buffer, const int buf_len)
{
	int ret;
	char errstr[512]={0};
	
	if(NULL == buffer)
		return 0;

	ret = rd_kafka_produce(topic_, partition_, RD_KAFKA_MSG_F_COPY, 
							(void*)buffer, (size_t)buf_len, NULL, 0, NULL);

	if(ret == -1)
	{
		fprintf(stderr,"****Failed to produce to topic %s partition %i: %s*****\n",
			rd_kafka_topic_name(topic_), partition_,
			rd_kafka_err2str(rd_kafka_errno2err(errno)));
	
		rd_kafka_poll(handler_, 0);
		return PUSH_DATA_FAILED;
	}
	
	fprintf(stderr, "***Sent %d bytes to topic:%s partition:%i*****\n",
		buf_len, rd_kafka_topic_name(topic_), partition_);

	rd_kafka_poll(handler_, 0);

	return PUSH_DATA_SUCCESS;
}

int main()
{
	char test_data[100];
	strcpy(test_data, "helloworld");

	ProducerKafka* producer = new ProducerKafka;
	if (PRODUCER_INIT_SUCCESS == producer->init_kafka(0, "192.168.1.108:9092", "chenxun"))
	{
		printf("producer init success\n");
	}
	else
	{
		printf("producer init failed\n");
		return 0;
	}
	
	while (fgets(test_data, sizeof(test_data), stdin)) {
		size_t len = strlen(test_data);
		if (test_data[len - 1] == '\n')
			test_data[--len] = '\0';
		if (strcmp(test_data, "end") == 0)
			break;
		if (PUSH_DATA_SUCCESS == producer->push_data_to_kafka(test_data, strlen(test_data)))
			printf("push data success %s\n", test_data);
		else
			printf("push data failed %s\n", test_data);
	}

	producer->destroy();
	
	return 0;	
}


使用librdkafka库可以轻松地开发Kafka客户端应用程序。以下是使用librdkafka库的一些基本步骤: 1. 安装librdkafka库:您可以通过下载和编译源代码或使用操作系统的软件包管理器来安装librdkafka库。 2. 创建Kafka生产者/消费者配置:您需要设置Kafka集群的连接配置和其他参数,例如主题名称、分区、消息序列化器等。 3. 创建Kafka生产者/消费者:使用librdkafka库提供的API创建Kafka生产者/消费者对象。 4. 发送/接收消息使用Kafka生产者/消费者对象发送/接收消息。您可以使用同步或异步API发送/接收消息。 5. 处理错误:处理可能发生的错误,例如连接错误、发送错误、接收错误等。 以下是使用librdkafka库创建Kafka生产者/消费者的示例代码: ```c #include <stdio.h> #include <string.h> #include <librdkafka/rdkafka.h> int main(int argc, char **argv) { rd_kafka_t *rk; /* Producer instance handle */ rd_kafka_conf_t *conf; /* Temporary configuration object */ char errstr[512]; /* librdkafka API error reporting buffer */ /* Kafka broker configuration */ char *brokers = "localhost:9092"; char *topic = "test_topic"; /* Create Kafka configuration object */ conf = rd_kafka_conf_new(); /* Set bootstrap broker(s) */ if (rd_kafka_conf_set(conf, "bootstrap.servers", brokers, errstr, sizeof(errstr)) != RD_KAFKA_CONF_OK) { fprintf(stderr, "Failed to set broker: %s\n", errstr); rd_kafka_conf_destroy(conf); return 1; } /* Create producer instance */ rk = rd_kafka_new(RD_KAFKA_PRODUCER, conf, errstr, sizeof(errstr)); if (!rk) { fprintf(stderr, "Failed to create producer: %s\n", errstr); rd_kafka_conf_destroy(conf); return 1; } /* Create message object */ rd_kafka_topic_t *rkt; rkt = rd_kafka_topic_new(rk, topic, NULL); /* Produce message */ const char *message = "Hello, Kafka!"; size_t len = strlen(message); rd_kafka_resp_err_t err; err = rd_kafka_produce(rkt, RD_PARTITION_UA, RD_MSG_F_COPY, (void *)message, len, NULL, 0, NULL); if (err != RD_KAFKA_RESP_ERR_NO_ERROR) { fprintf(stderr, "Failed to produce message: %s\n", rd_kafka_err2str(err)); } /* Wait for message delivery */ rd_kafka_poll(rk, 0); /* Destroy message object */ rd_kafka_topic_destroy(rkt); /* Destroy producer instance */ rd_kafka_destroy(rk); return 0; } ``` 这是一个简单的Kafka生产者示例代码,它将消息“Hello, Kafka!”发送到Kafka集群。您可以使用类似的方式创建Kafka消费者。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值