是否建议在 schema.registry.url 中使用多个 URL?
Is it recommended to use multiple URLs in schema.registry.url?
此处的文档 https://docs.confluent.io/current/schema-registry/index.html 提到了使用单个 URL 的可能性,这意味着也可以使用多个,以逗号分隔,但是,问题是建议使用什么以及为什么使用类似于 F5,或者只是逗号分隔的 URLs?
我用 kafka-avro-console-producer 和 kafka-avro-console-consumer 测试了逗号分隔的 URLs,虽然后者总是按预期运行,但前者有时 returns(打印到控制台)>>错误无法将 HTTP 请求发送到端点 << 当 URL 之一出错时,尽管它会向 Kafka 生成消息,但不会崩溃。我宁愿它不那样做,但在实际应用程序代码中总是可以忽略这样的异常。它实际上打印了整个错误堆栈,而不仅仅是这几个字。我也看到了这个:
https://github.com/confluentinc/confluent-kafka-dotnet/issues/711
我们将使用 3 URLs 作为配置参数值,您认为如何?
我们使用 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 定义为我们在上面的示例中为 BOOTSTRAP_SERVERS_CONFIG 做了,或者我们应该使用外部负载平衡器,例如 F5 或循环 DNS,并让它提供单个 ipaddr/alias(如示例中的 schema_registry_loadbalanced下面)解析为 kafka1、kafka2 和 kafka3?这将在这样的应用程序代码中使用:
props.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://schema_registry_loadbalanced:8081");
对于 kafka 连接,我们认为外部负载均衡器不会提供太多好处,但对于模式注册表我们不确定。
这取决于您的客户端,但至少 Java 属性设置为将配置类型作为 URL 列表。
在我工作的地方,注册表是一个负载平衡器,所以它是一个 URL 无论如何。
此处的文档 https://docs.confluent.io/current/schema-registry/index.html 提到了使用单个 URL 的可能性,这意味着也可以使用多个,以逗号分隔,但是,问题是建议使用什么以及为什么使用类似于 F5,或者只是逗号分隔的 URLs?
我用 kafka-avro-console-producer 和 kafka-avro-console-consumer 测试了逗号分隔的 URLs,虽然后者总是按预期运行,但前者有时 returns(打印到控制台)>>错误无法将 HTTP 请求发送到端点 << 当 URL 之一出错时,尽管它会向 Kafka 生成消息,但不会崩溃。我宁愿它不那样做,但在实际应用程序代码中总是可以忽略这样的异常。它实际上打印了整个错误堆栈,而不仅仅是这几个字。我也看到了这个: https://github.com/confluentinc/confluent-kafka-dotnet/issues/711
我们将使用 3 URLs 作为配置参数值,您认为如何?
我们使用 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 定义为我们在上面的示例中为 BOOTSTRAP_SERVERS_CONFIG 做了,或者我们应该使用外部负载平衡器,例如 F5 或循环 DNS,并让它提供单个 ipaddr/alias(如示例中的 schema_registry_loadbalanced下面)解析为 kafka1、kafka2 和 kafka3?这将在这样的应用程序代码中使用:
props.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://schema_registry_loadbalanced:8081");
对于 kafka 连接,我们认为外部负载均衡器不会提供太多好处,但对于模式注册表我们不确定。
这取决于您的客户端,但至少 Java 属性设置为将配置类型作为 URL 列表。
在我工作的地方,注册表是一个负载平衡器,所以它是一个 URL 无论如何。