如何从 RD Kafka Client 中的文件读取配置值?
how to read configuration values from a file in RD Kafka Client?
我使用 LIBRDKAFKA C 库开发了一个 RD Kafka 客户端。
LIBRDKAFKA C 库公开了 set_config API 来设置消费者和生产者句柄的配置值。大约有数百个配置可供设置,每个值 set_congig 变得非常乏味。重要的是,它在代码本身中设置配置的效率不高,因为这里我们没有根据不同平台灵活调整配置值的方法,因为它需要重新构建 RD Kafka 客户端。
librdkafka 配置接口的设计考虑了这一点,为 95% 的配置属性(其余为 C 回调等,需要适当的类型)提供一个简单的字符串键值 API。
下面是一个关于如何实现允许设置任何标准 librdkafka 配置的配置文件 reader(使用 key=value\n
语法)的示例:
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 = '[=10=]';
if (*b == '#' || !*b)
continue;
if (!(t = strchr(b, '=')))
fprintf(stderr, "%s:%i: expected name=value format\n",
conf_path, line);
name = b;
*t = '[=10=]';
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, ..);
我使用 LIBRDKAFKA C 库开发了一个 RD Kafka 客户端。 LIBRDKAFKA C 库公开了 set_config API 来设置消费者和生产者句柄的配置值。大约有数百个配置可供设置,每个值 set_congig 变得非常乏味。重要的是,它在代码本身中设置配置的效率不高,因为这里我们没有根据不同平台灵活调整配置值的方法,因为它需要重新构建 RD Kafka 客户端。
librdkafka 配置接口的设计考虑了这一点,为 95% 的配置属性(其余为 C 回调等,需要适当的类型)提供一个简单的字符串键值 API。
下面是一个关于如何实现允许设置任何标准 librdkafka 配置的配置文件 reader(使用 key=value\n
语法)的示例:
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 = '[=10=]';
if (*b == '#' || !*b)
continue;
if (!(t = strchr(b, '=')))
fprintf(stderr, "%s:%i: expected name=value format\n",
conf_path, line);
name = b;
*t = '[=10=]';
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, ..);