apache-kafka - 如何从自定义 PartitionAssignor 实现中获取机架 ID 或消费者信息
问题描述
我需要实现一个基于机架感知的自定义 Kafka PartitionAssignor。我的自定义分配器将覆盖订阅方法,以便能够读取消费者的实例信息:
/**
* Return a serializable object representing the local member's subscription. This can include
* additional information as well (e.g. local host/rack information) which can be leveraged in
* {@link #assign(Cluster, Map)}.
* @param topics Topics subscribed to through {@link org.apache.kafka.clients.consumer.KafkaConsumer#subscribe(java.util.Collection)}
* and variants
* @return Non-null subscription with optional user data
*/
Subscription subscription(Set<String> topics);
该方法的想法是读取当前消费者的实例信息,例如 rack.id 以发布到 ConsumerCoordinator,后者会将它们转发给 assign() 方法。不幸的是,我还没有找到获取消费者信息的机制,因为在运行时没有对它的引用。问题是:如何从我的自定义 Kafka PartitionAssignor 实现中获取消费者的实例信息?
谢谢。
解决方案
订阅类有一个字节缓冲区,您可以将任意数据放入:
class Subscription {
private final List<String> topics;
private final ByteBuffer userData; <---- HERE
}
您将此数据设置为PartitionAssignor
每个消费者必须运行的数据。然后这个订阅(包括数据)被交给PartitionAssignor
一些选定的消费者来计算新的分配:
Map<String, Assignment> assign(Cluster metadata, Map<String, Subscription> subscriptions);
推荐阅读
- c++ - 谷歌风格指南(前向声明部分)
- python - 输入表单数据时django模型错误
- keystore - 在 spring 云配置服务器上使用非对称密钥作为 PEM 编码的文本
- batch-file - 仅通过 SET 更改小写字母?
- graphql - 如何使用 graphql apollo-server 调节(后处理)解析的数组
- image - Slick carousel 的图片现在仅在从成功的 Facebook Connect 回来后才会显示
- node.js - 错误:找不到模块“body-Parser”部署 HEROKU
- gulp - Gulp 任务创建页面特定的 js 文件,将常见的 js 文件与页面特定的文件连接起来
- c# - 在不使用磁盘的情况下即时压缩流
- powershell - 在 ForEach-Object 循环中编辑文本文件内容