【发布时间】:2019-05-06 23:24:57
【问题描述】:
https://docs.confluent.io/current/schema-registry/index.html 此处的文档提到了使用单个 URL 的可能性,这意味着也可以使用多个 URL,以逗号分隔,但是,问题是推荐什么以及为什么,使用 F5 之类的东西,或者简单地使用逗号-分开的网址?
我用 kafka-avro-console-producer 和 kafka-avro-console-consumer 测试了逗号分隔的 URL,虽然后者总是按预期运行,但前者有时会返回(打印到控制台)>>ERROR Failed当其中一个 URL 错误时,将 HTTP 请求发送到端点https://github.com/confluentinc/confluent-kafka-dotnet/issues/711
我们会使用 3 个 URL 作为配置参数值,你怎么看?
我们使用Java客户端,代码如下:
final Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://kafka1:8081,http://kafka2:8081,http://kafka3:8081");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, true);
所以,假设我们有 3 个 kafka 代理服务器节点,kafka1、kafka2 和 kafka3,并且我们在每个节点上启动了一个模式注册表实例,我们是否应该使用类似的语法来定义 SCHEMA_REGISTRY_URL_CONFIG,就像我们在上面的例子,或者我们应该使用外部负载均衡器,例如 F5 或循环 DNS,并让它提供一个解析为 kafka1、kafka2 和 kafka3 的 ipaddr/别名(如下面示例中的 schema_registry_loadbalanced)?这将在应用程序代码中使用,如下所示:
props.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://schema_registry_loadbalanced:8081");
对于 kafka 连接,我们认为外部负载均衡器不会提供太多好处,但对于模式注册表我们不确定。
【问题讨论】:
标签: apache-kafka confluent-schema-registry