我可以通过互联网使用 kafka 吗?

Can I use kafka over Internet?

kafka适合上网吗?

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

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

我还必须公开 zookeeper 吗?我认为新的 consumer/producer api 不再需要它了。

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

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

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

除了配置客户端 TLS 之外,代理还必须有 public IP,我们尽量避免。通常对于其他服务,我们将所有内容隐藏在负载均衡器之后。卡夫卡可以吗?

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

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

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

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

  • HTTP 代理
  • 或者至少我会使用一个专用的 FE Kafka 服务器(或几个用于 HA 的服务器)专用于将消息转发到主 Kafka 服务器组的每个客户端

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

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

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