使用固定/静态的代理列表运行 kafka 生产者



通常 kafka java 客户端(在 Spring 引导中使用,但我认为这在这里并不重要,就像一个侧节点(使用boostrap.servers配置(它需要代理地址:端口的列表(来建立初始连接。之后,元数据请求用于发现当前已注册的集群的所有成员。

我现在的问题是,如何在 java 客户端中禁用此发现。我想让KafkaProducer使用我提供给它的经纪人列表作为固定的静态列表。

多一点背景

我的 Spring 应用程序部署到的平台不允许互联网访问任何端口,除非使用 HTTP 代理(443 或 80(。另一种选择是使用 TCP 代理,其工作原理类似于以下内容:

  • 代理提供应用程序可以连接到的主机名和端口
  • 连接后,数据流将转发到先前(在创建代理期间(命名的主机名和端口

通过这种方式,平台可以控制哪些流量来自谁以及流向何处,这是我组织的安全要求。然后,通信路径如下所示:

----------------------         -------------         -----------------------
| Application client |  <--->  | TCP Proxy |  <--->  | Target (e.g. kafka) |
----------------------         -------------         -----------------------

但是,此方法实际上不适用于我需要与之通信的公共 kafka 集群,因为 boostrap.servers 列表中的 kafka 代理(我可以很好地连接到它(将返回具有我无法连接的公共端点名称的节点列表(因为它们没有通过代理(。

因此,与其使用 Kafka 客户端的发现功能,我想使用固定的预定义代理列表,我可以将其设置为使用 TCP 代理。但是,到目前为止,我在 API 中没有看到任何解决方案,希望在这里得到一些帮助。

我知道,不使用此功能会使应用程序无法使用 kafka 集群状态的动态更改(当一个代理消失并且另一个代理启动时(,但是,这在我的方案和所有给定情况下都是可以的。

不允许对

任何端口进行互联网访问,除非使用HTTP代理(443或80(。

您是否考虑过使用 Confluent REST 代理?

Confluent REST 代理为 Kafka 集群提供了一个 RESTful 接口,使其能够轻松生成和使用消息、查看集群状态以及执行管理操作,而无需使用本机 Kafka 协议或客户端。

Maven 为客户协调

<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-rest</artifactId>
<version>5.3.2</version> 
</dependency>

还有一个特使代理解决方案正在开发中 - https://github.com/envoyproxy/envoy/issues/2852

还有一个用于 k8s 环境的 TCP 代理 - https://github.com/grepplabs/kafka-proxy

但是,公开 NodePorts/无头服务端口将是公开 k8s kafka 集群的正确方法

虽然没有办法不使用元数据请求,但您可以考虑advertised.listeners配置,这将允许您的内部网络代理通告您在该特定代理的代理上配置的主机名和端口,以响应元数据请求。

更多细节可以在这里找到

作为直接连接到每个代理的公示主机名的替代方法(这是 Kafka 功能所必需的(,您还可以考虑在网络中设置 1 个或多个 Kafka REST 代理,然后将代理指向该代理,或者将代理指向在多个 Kafka REST 代理之间平衡的负载均衡器。

最新更新