apache-kafka - 确保每个 Kafka 消费者具有不同/唯一的 group.id 来实现发布-订阅的策略
问题描述
我正在尝试使用 Kafka 实现一个发布-订阅模型,其中一个主题将被许多独立消费者读取/使用。
据我了解,每个消费者通过使用唯一的 group.id 将自己标识为唯一的订阅者
但是,如果消费者 B 使用与消费者 A 相同的 group.id 来宣传自己,则恶意或有缺陷的消费者 B 可以强化消费者 A 的消息。因此,消息将在消费者 A 和 B 之间分发,这是不希望的。
是否有任何 Kafka 机制或策略来防止这种情况发生?
我找不到任何人讨论这个问题;让我想知道我是否误解了 group.ids 或者我错过了一些明显的解决方案。很抱歉,如果这是一个菜鸟问题,但非常感谢您的时间!
解决方案
你想要的是一种叫做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
推荐阅读
- kubernetes - 对 1.14.4 的新 kubernetes 集群没有权限
- typescript - AWS CDK - 如何调用函数 Fn.cidr?
- jquery - 尝试使用 ajax post 解析数据时出现错误“内部服务器错误 [500]”
- android - 下载 JSON 文件并保存在内部存储 (Android/Kotlin)
- ios - 如何检测锁屏状态以在 CallKit 和 LocalNotification 之间选择来电?
- javascript - 需要从数组中配对对象的值
- java - Android:没有 onCreate() 方法的服务类
- c# - 无法隐式转换类型'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry
'到'T' - types - Julia 中是否有用于将类型的字段值转储到元组中的函数?
- python - 提高简单 DataFrame 操作的性能和可扩展性