kafka多个消费者消费一个topic_你真的了解 Kafka 消费者吗?

文章内容输出来源:拉勾教育Java高薪训练营;

kafka 消费者是做什么的?既然生产者是往 broker 中topic 特定的 分区发送消息。那么消费者就是从这些分区中读取消息了。那具体的流程又是怎么样的呢?有又哪些特性呢?接下来我们一起揭晓。

消费者和消费组

我们先来说说什么是消费者和消费组。

消费者是从订阅的主题中消费消息,一群消费者组成的一个消费组。多个从同一个主题消费的消费者可以加入到一个消费组中,消费组中的消费者共享group_id。也就是说消费组中的所有消费者的 group_id 是一样的

注意消费组均衡地给消费者分配分区,每个分区只由消费组中一个消费者消费。这样就可以避免消息重复消费了。

2a12ec9ff2fe341e521b76ad75283f38.png

如果消费组中消费者数量小于topic 中的分区数量,就说明有不同的分区指向了同一个消费者。

如果消费组中消费者的数量等于topic 中的分区数量,说明每个分区指定一个消费者。

如果消费组中国消费者的数量大于 topic 中的分区数量,说明消费组中会有空余的消费者。

这样的机制有什么好处?

可以分方便的横向扩展消费者。比如说,如果发现主题中分区很多,消费者组消费不过来,出现了消息的堆积。这个时候就可以拓展消费组,增加消费者,从而消除消息堆积的问题。

心跳机制

既然每个分区都绑定一个消费者,消费者和topic 之间就得检测心跳了。Kafka 的心跳是 Kafka Consumer 和 Broker 之间的健康检查,只有当 Broker Coordinator 正常时,Consumer 才会发送心跳。

也就是说,消费者从broker 中消费消息,创建的是一个长连接。并且在进行心跳检测,只有当broker 正常保持心跳时,才会进行消费消息。

反序列化

我们在生产者发送的消息的时候,有三个流程,拦截器、序列化器、分区器。那消费者

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值