我能在互联网上使用kafka吗?

10

kafka是否适用于互联网使用?

更具体地说,我想将kafka主题公开为"公共接口",然后外部消费者(或生产者)可以连接到它。这个可行吗?

我听说如果我想在内部和外部网络中同时使用群集,则很难配置advertised.host.name。这是真的吗?

我是否也必须暴露zookeeper?我认为新的consumer/producer api不再需要。


我看到了这个链接 https://cwiki.apache.org/confluence/display/KAFKA/KIP-103%3A+Separation+of+Internal+and+External+traffic 。不确定它是否相关。 - ntysdd
将Django/Flask REST API放在其前面。 - Kermit
4个回答

11

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

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

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


11
我个人不建议直接通过TCP将Kafka服务器暴露给客户端,原因如下:
  • 如果一个恶意客户端打开了太多的连接,这可能会影响Kafka平台的稳定性,并可能影响其他客户端
    • Kafka服务器上打开文件过多,需要进行硬件/软件设置和操作系统调整以限制无控制的客户端
  • 如果您需要添加Kafka服务器来增加可扩展性,则可能需要在客户端和服务器端都进行大量低级配置(防火墙,IP可见性,证书等)。其他产品使用网关或代理解决这些问题:Coherence使用扩展代理客户端,tibco EMS使用路由目标,其他软件(许多JMS服务器)使用存储和转发机制等。
  • Kafka节点的维护,在连接到Kafka服务器的客户端的情况下,还必须考虑客户端的需求和已与客户端定义的服务级别协议(例如24 * 7 * 365)
  • 如果您还将Kafka用作后端服务,则应考虑多层架构:FE网关和BE服务等。
  • 其他方面需要了解您在系统中考虑为外部(通过互联网)消费者/生产者的确切内容。它是您的系统组件,需要访问Kafka服务器吗?它们是您组织的内部还是外部,等等。 ...

当然,所有这些问题也可以通过TCP直接连接到Kafka服务器来正确解决,但我个人会使用不同的解决方案。

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

5

有可能将Kafka暴露在互联网上(事实上,像Aiven和Instaclustr这样的托管Kafka提供商就是这样赚钱的),但您必须确保其得到充分的安全保护。最低要求:

  • ZooKeeper节点应该位于私有子网中,不应可从外部进行路由。 ZK的安全性不足,并且在任何情况下,使用ZK地址引导Kafka客户端也不再是必需的。
  • 在网络层面上限制经纪人的访问。如果所有客户端都来自受信任的网络,请设置适当的防火墙规则。如果在AWS中,则可以使用VPC互连或直接连接(如果您正在进行云对云或云对地连接)。如果大多数客户端都在受信任的网络中,但某些相对少数的客户端不在其中,则强制后者通过VPN隧道进行连接。最后,如果您想允许来自任意位置的连接,则只需在9092端口(或您配置经纪人侦听的任何端口)上“允许*”即可;只需确保其他端口关闭即可。
  • 为客户端-经纪人连接启用TLS(SSL)。这可以使用自签名CA 轻松配置。根据您如何公开侦听器,您可能需要在客户端上禁用SSL主机名验证。(如果广告主机名与证书的公共名称不匹配,则证书信任链将断开。)客户端将需要安装CA证书。(与经纪人的证书签名相同的CA。)
  • 可选地,您可以启用双向TLS身份验证;但是,这在逻辑上更加繁琐,因为它要求每个客户端都有自己的私钥,并由经纪人信任的CA进行签名。
  • 使用SASL对客户端进行身份验证,并为预期访问群集的每个应用程序和每个人创建单独的用户。
  • 遵循最小特权原则(PoLP),为每个用户在ACL中发出最少的群集和主题级别的访问权限。
请注意:并非所有工具都支持SASL/SSL连接,有些工具实际上需要连接到ZooKeeper节点(在上述设置中无法访问)。确保您依赖的任何工具直接使用“新”的连接方式连接到Kafka代理,并且不需要ZooKeeper连接。

我们进行了这项评估,并最终得出了完全相同的结论。你的答案很可靠! - mr.buttons

1
除了配置客户端TLS之外,代理必须拥有公共IP,但我们尽量避免。通常情况下,我们会通过负载均衡器隐藏所有其他服务。Kafka能否实现这一点?
我不确定托管在公共服务器上的Confluent REST代理是否是一个真正的选择,特别是当你需要高性能的Java生产者客户端时。

据我所知,您不能将Kafka集群隐藏在负载均衡器后面,因为每个生产者必须直接连接到特定代理节点,该节点是生产者需要写入的分区的领导者。 - Guido
1
正确的@guido,您必须允许客户端直接连接到代理(TCP代理将起作用,但无法负载均衡)。但是,您可以在引导过程中使用负载平衡器。实际上,在Kubernetes中部署Kafka时通常会这样做--客户端通过服务地址连接,然后发现代理地址。 - Emil Koutanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接