确保每个Kafka使用者拥有不同/唯一的group.id的策略,以实现发布-订阅

时间:2018-10-16 14:01:39

标签: apache-kafka kafka-consumer-api

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

据我了解,每个消费者都通过使用唯一的组将自己标识为唯一的订户。

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

有没有防止这种情况发生的卡夫卡机制或策略?

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

1 个答案:

答案 0 :(得分:1)

您想要的是手动分区分配。在这种模式下,自动使用方重新平衡功能处于关闭状态,因此您可以完全控制要使用的主题/分区,并且即使使用相同的使用方组,也没有任何使用方可以“窃取”您的消息。 ID。当然,不利的一面是,如果有任何消费者下跌,汽车消费者就不会重新平衡。

摘自官方Javadocs(重点介绍):

  

要使用此模式,而不是使用订阅来订阅主题,   您只需使用所有分区的完整列表调用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