我正在尝试使用Kafka实现一个发布-订阅模型,其中一个主题将被许多独立的消费者读取/使用。
据我了解,每个消费者都通过使用唯一的组将自己标识为唯一的订户。
但是,如果消费者B使用与消费者A相同的group.id自我宣传自身,则恶意或有缺陷的消费者B可以强化消费者A的消息。因此,消息将在消费者A和B之间分发,这是不希望的。
有没有防止这种情况发生的卡夫卡机制或策略?
我找不到任何人在讨论这个问题;让我想知道是否是我误解了group.ids还是错过了一些明显的解决方案。非常抱歉,这是一个菜鸟问题,但是非常感谢您的宝贵时间!
答案 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