首页 > 解决方案 > 确保每个 Kafka 消费者具有不同/唯一的 group.id 来实现发布-订阅的策略

问题描述

我正在尝试使用 Kafka 实现一个发布-订阅模型,其中一个主题将被许多独立消费者读取/使用。

据我了解,每个消费者通过使用唯一的 group.id 将自己标识为唯一的订阅者

但是,如果消费者 B 使用与消费者 A 相同的 group.id 来宣传自己,则恶意或有缺陷的消费者 B 可以强化消费者 A 的消息。因此,消息将在消费者 A 和 B 之间分发,这是不希望的。

是否有任何 Kafka 机制或策略来防止这种情况发生?

我找不到任何人讨论这个问题;让我想知道我是否误解了 group.ids 或者我错过了一些明显的解决方案。很抱歉,如果这是一个菜鸟问题,但非常感谢您的时间!

标签: apache-kafkakafka-consumer-api

解决方案


你想要的是一种叫做Manual Partition Assignment的东西。在这种模式下,自动消费者重新平衡被关闭,因此您可以完全控制您正在消费的主题/分区,并且没有消费者可以“窃取”您的消息,即使他们使用相同的消费者组。 ID。当然,不利的一面是,万一任何消费者下降,汽车消费者就不会再平衡。

来自官方 Javadocs(突出显示我的):

要使用这种模式,而不是使用 subscribe 订阅主题,您只需调用 assign(Collection) 并使用要使用的分区的完整列表。

 String topic = "foo";
 TopicPartition partition0 = new TopicPartition(topic, 0);
 TopicPartition partition1 = new TopicPartition(topic, 1);
 consumer.assign(Arrays.asList(partition0, partition1));   Once assigned, you can call poll in a loop, just as in the preceding

使用记录的示例。消费者指定的组仍然用于提交偏移量,但现在分区集只会随着另一个调用分配而改变。手动分区分配不使用组协调,因此消费者失败不会导致分配的分区重新平衡。每个消费者独立行动,即使它与另一个消费者共享一个 groupId。为避免偏移提交冲突,您通常应确保 groupId 对于每个消费者实例都是唯一的。

完整文档在这里(查找手动分区分配部分):https ://kafka.apache.org/20/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html


推荐阅读