如何从RD Kafka客户端中的文件读取配置值?

时间:2017-09-15 11:14:43

标签: kafka-consumer-api kafka-producer-api

我使用LIBRDKAFKA C Library开发了一个RD Kafka客户端。 LIBRDKAFKA C库已公开set_config API以设置Consumer和Producer Handles的配置值。有大约数百个配置可供设置,每个值的set_congig变得非常繁琐。重要的是它在代码本身设置配置的效率不高,因为我们没有灵活性来根据不同的平台调整配置值,因为它需要重新构建RD Kafka客户端。

1 个答案:

答案 0 :(得分:0)

librdkafka配置界面的设计考虑到了这一点,为95%的配置属性提供了一个简单的字符串键,值API(其余的是C回调等,需要适当的类型)。

这里有一个关于如何实现配置文件阅读器(带有key=value\n语法)的示例,它允许设置任何标准的librdkafka配置:

rd_kafka_conf_t *conf = rd_kafka_conf_new();
FILE *fp;
char buf[512];
int line = 0;

fp = fopen(conf_path, "r");
if (!fp) ;// add error checking..

while (fgets(buf, sizeof(buf)-1, fp)) {
    char *t;
    char *b = buf;
    rd_kafka_conf_res_t res;
    char *name, *val;
    char errstr[512];

    line++;

    if ((t = strchr(b, '\n')))
        *t = '\0';

    if (*b == '#' || !*b)
        continue;

    if (!(t = strchr(b, '=')))
        fprintf(stderr, "%s:%i: expected name=value format\n",
              conf_path, line);

    name = b;
    *t = '\0';
    val = t+1;

    res = rd_kafka_conf_set(conf, name, val, errstr, sizeof(errstr));
    if (res != RD_KAFKA_CONF_OK)
        fprintf(stderr, "%s:%i: %s\n", conf_path, line, errstr);
}

fclose(fp);

...
// Create client
rd_kafka_t *rk;
rk = rd_kafka_new(... , conf, ..);