kafka多个消费者消费一个topic_Kafka 独立消费者

本文介绍了Kafka的独立消费者模式,用于解决消费者需要指定分区消费的场景,避免消费组重平衡带来的问题。在独立消费者模式下,消费者需要自行管理消费偏移量,且异常时不会自动重分配分区,需要保证消费者高可用。文中还展示了如何使用Kafka的assign方法手动订阅指定分区进行消费。
摘要由CSDN通过智能技术生成

以前我们讨论的消费组,都是 group 的形式,group 可以自动地帮助消费者分配分区,且在发生异常时,还能自定地进行重平衡(Rebalance)。正常来说,group 帮助用户实现自动监听分区消费,但是在用户需要指定分区进行精确消费的场景下,由于 group 的重平衡机制,会打破这种消费方式,这不前段时间某项目就有个需求是这样的:

消息源端有若干个,每个消息源都会产生不同的消息,目标端也有若干个,每个目标端需要消费指定的消息源类型。

在以往,由于消费组的重平衡机制会打乱这种消费方式,只能申请多个主题对消息进行隔离,每个消息源将消息发送到指定主题,目标端监听指定的主题。这么做肯定没有指定分区消费这么优雅了,每增加一种消息源,都需要新增一个 topic,且消费粒度不能灵活组合。

针对以上问题,Kafka 的提供了独立消费者模式,可以消费者可以指定分区进行消费,如果只用一个 topic,每个消息源启动一个生产者,分别发往不同的分区,消费者指定消费相关的分区即可,用如下图所示:

0b02c3bd95bf776bc61100a1ff32b723.png

但是 Kafka 独立消费者也有它的限定场

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Kafka Consumer API 来消费多个 topic 的消息。具体实现代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <librdkafka/rdkafka.h> int main(int argc, char **argv) { rd_kafka_t *rk; /* Kafka producer instance handle */ rd_kafka_conf_t *conf; /* Temporary configuration object */ char errstr[512]; /* librdkafka API error reporting buffer */ char *brokers; /* Kafka broker(s) */ char *topics; /* Topic list to consume from */ rd_kafka_topic_partition_list_t *topic_list; /* List of topics to subscribe to */ rd_kafka_resp_err_t err; /* librdkafka API error code */ /* Check arguments */ if (argc != 3) { fprintf(stderr, "Usage: %s <broker> <topic1,topic2,...>\n", argv[]); exit(1); } brokers = argv[1]; topics = argv[2]; /* Create Kafka client configuration place-holder */ conf = rd_kafka_conf_new(); /* Set bootstrap broker(s) as a comma-separated list of * host or host:port (default port is 9092). * librdkafka will use the bootstrap brokers to acquire the full * set of brokers from the cluster. */ if (rd_kafka_conf_set(conf, "bootstrap.servers", brokers, errstr, sizeof(errstr)) != RD_KAFKA_CONF_OK) { fprintf(stderr, "%s\n", errstr); exit(1); } /* Create Kafka producer instance */ rk = rd_kafka_new(RD_KAFKA_CONSUMER, conf, errstr, sizeof(errstr)); if (!rk) { fprintf(stderr, "Failed to create Kafka producer: %s\n", errstr); exit(1); } /* Create topic list */ topic_list = rd_kafka_topic_partition_list_new(1); if (!topic_list) { fprintf(stderr, "Failed to create topic list\n"); exit(1); } /* Parse topic list */ if (rd_kafka_topic_partition_list_add(topic_list, topics, RD_KAFKA_PARTITION_UA) != topic_list->cnt) { fprintf(stderr, "Failed to parse topic list: %s\n", rd_kafka_err2str(rd_kafka_last_error())); exit(1); } /* Subscribe to topic list */ err = rd_kafka_subscribe(rk, topic_list); if (err) { fprintf(stderr, "Failed to subscribe to topic list: %s\n", rd_kafka_err2str(err)); exit(1); } /* Consume messages */ while (1) { rd_kafka_message_t *msg; /* Poll for new messages */ msg = rd_kafka_consumer_poll(rk, 100); if (!msg) { continue; } /* Print message */ printf("Received message on topic %s (partition %d) at offset %ld:\n", rd_kafka_topic_name(msg->rkt), msg->partition, msg->offset); printf("%.*s\n", (int)msg->len, (char *)msg->payload); /* Free message */ rd_kafka_message_destroy(msg); } /* Destroy topic list */ rd_kafka_topic_partition_list_destroy(topic_list); /* Destroy Kafka producer instance */ rd_kafka_destroy(rk); return ; } ``` 以上代码实现了消费多个 topic 的消息,具体实现过程如下: 1. 创建 Kafka client configuration place-holder。 2. 设置 bootstrap broker(s)。 3. 创建 Kafka producer instance。 4. 创建 topic list。 5. 解析 topic list。 6. 订阅 topic list。 7. 消费消息。 8. 销毁 topic list 和 Kafka producer instance。 注意:以上代码仅供参考,实际使用时需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值