6

kafka适合上网吗?

更准确地说,我想要的是将 kafka 主题公开为“公共接口”,然后外部消费者(或生产者)可以连接到它。可能吗?

我听说如果我想在内部和外部网络中使用集群会有问题,因为很难配置adverted.host.name。真的吗?

我也必须暴露动物园管理员吗?我认为新的消费者/生产者 API 不再需要它。

4

4 回答 4

9

由于这些原因,我个人不会通过 TCP 将 Kafka 服务器直接暴露给客户端,仅举几例:

  • 如果一个坏的客户端打开了太多的连接,这可能会影响 Kafka 平台的稳定性,也可能会影响其他客户端
    • Kafka 服务器上打开的文件过多,需要硬件/软件设置和操作系统调整来限制不受控制的客户端
  • 如果您需要添加 Kafka 服务器以提高可扩展性,您可能需要在客户端和服务器端进行大量低级配置(防火墙、IP 可见性、证书等)。其他产品使用网关或代理解决这些问题:Coherence 使用扩展代理客户端,tibco EMS 使用路由目的地,其他 SW(许多 JMS 服务器)使用 Store&Forward 机制等。
  • Kafka 节点的维护,如果客户端连接到 Kafka 服务器,还必须考虑客户端的需求和与客户端定义的 SLA(服务级别协议)(例如 24*7*365)
  • 如果同时使用 Kafka 作为后端服务,需要考虑多层架构:FE 网关和 BE 服务等。
  • 其他注意事项需要了解您认为系统中的外部(通过互联网)消费者/生产者的确切含义。它是需要访问 Kafka 服务器的系统组件吗?它们是您组织内部的还是外部的,等等......

当然,所有这些考虑因素也可以使用与 Kafka 服务器的 TCP 直接连接来正确解决,但我个人会使用不同的解决方案。

  • HTTP 代理
  • 或者至少我会使用一个专用的 FE Kafka 服务器(或几个用于 HA 的服务器),专用于将消息转发到主要 Kafka 服务器组的每个客户端
于 2018-06-25T15:05:56.130 回答
7

Kafka 的有线协议是基于 TCP 的,可以在公共互联网上正常工作。在最新版本的 Kafka 中,您可以为内部和外部流量配置多个接口。生产环境中的 Internet 上 Kafka 示例包括来自 Heroku、IBM MessageHub 和 Confluent Cloud 的多个 Kafka 即服务产品。

如果 Kafka 客户端使用新的消费者 API,则不需要公开 zookeeper。

您还可以选择公开 REST 代理(例如开源 Confluent REST 代理)作为对客户端防火墙更友好的接口,因为它通过 HTTP(S) 运行并且不会被大多数公司或个人防火墙阻止。

于 2017-09-05T05:14:10.910 回答
3

可以通过 Internet 公开 Kafka(事实上,这就是 Aiven 和 Instaclustr 等托管 Kafka 提供商赚钱的方式),但您必须确保它得到充分保护。至少:

  • ZooKeeper 节点应该驻留在私有子网中,并且不能从外部路由。ZK 的安全性不足,无论如何,不​​再需要使用 ZK 地址引导 Kafka 客户端。
  • 在网络级别限制对代理的访问。如果您的所有客户端都从受信任的网络连接,则设置适当的防火墙规则。如果在 AWS 中,则在连接云到云或云到地面时使用 VPC 对等或 Direct Connect。如果您的大多数客户端都在受信任的网络上,但相对少数不在,请强制后者通过 VPN 隧道。最后,如果您想允许来自任意位置的连接,您只需要allow *使用端口 9092(或您配置代理侦听的任何端口);只需确保其他端口已关闭。
  • 为客户端代理连接启用 TLS (SSL)。这很容易使用自签名 CA 进行配置。根据您公开侦听器的方式,您可能需要在客户端上禁用 SSL 主机名验证。(如果公布的主机名与证书的公用名不匹配,则证书信任链中断。)客户端将需要安装 CA 证书。(签署经纪人证书的同一 CA。)
  • 或者,您可以启用双向 TLS 身份验证;但是,这在逻辑上更加繁重,因为它要求每个客户都有自己的私钥,该私钥由经纪人信任的 CA 签名。
  • 使用 SASL 对代理的客户端进行身份验证,并为每个应用程序和预期访问集群的每个人创建单独的用户。
  • 遵循最小权限原则 (PoLP),在 ACL 中为每个用户颁发最低限度的集群级和主题级访问权限。

要记住的另一件事:并非所有工具都支持 SASL/SSL 连接,并且某些工具实际上需要连接到 ZooKeeper 节点(在上述设置中无法访问)。确保您依赖的任何工具都使用直接连接到 Kafka 代理的“新”样式,并且不需要 Zookeeper 连接。

于 2019-10-10T08:22:54.987 回答
1

除了配置客户端 TLS 之外,代理还必须拥有我们试图避免的公共 IP。通常对于其他服务,我们将所有内容隐藏在负载均衡器后面。卡夫卡可以做到这一点吗?

当您需要 java 生产者客户端的高性能批处理时,我不确定托管在公共服务器上的 Confluent REST 代理是否是一个真正的选择。

于 2017-10-09T23:27:03.437 回答