是否建议在schema.registry.url中使用多个URL?

时间:2019-05-03 08:24:51

标签: apache-kafka confluent-schema-registry

此处的文档https://docs.confluent.io/current/schema-registry/index.html提到了可以使用单个URL的可能性,这意味着也可以使用多个URL(以逗号分隔),但是,问题是建议什么,为什么使用F5之类的东西,或者简单地使用逗号分隔的网址?

我用kafka-avro-console-producer和kafka-avro-console-consumer测试了逗号分隔的URL,虽然后者始终表现出预期,但前者有时会返回(打印到控制台)>>错误失败在其中一个URL不好的情况下将HTTP请求发送到endpoint <<,尽管它会向Kafka发送消息,并且不会崩溃。我希望它不会这样做,但是在实际的应用程序代码中总是可以忽略这样的异常。实际上,它会打印整个错误堆栈,而不仅仅是这几个单词。我也看到了这一点: 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,并且我们分别在它们上启动了一个模式注册表实例,是否应该像在BOOTSTRAP_SERVERS_CONFIG中那样使用类似的语法来定义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连接,我们认为外部负载平衡器不会带来太多好处,但是对于架构注册表,我们不确定。

1 个答案:

答案 0 :(得分:1)

这取决于您的客户端,但是至少将Java属性设置为采用配置类型作为URL列表。

在我工作的地方,注册表正在成为负载平衡器,因此无论如何它都是一个URL。