由于我还不能发表评论,所以我会将其作为“答案”发布,并添加到 M.Situations 答案中。
在他链接的同一个文档中,有一个关于 KAFKA 客户端 (https://cwiki.apache.org/confluence/display/KAFKA/KIP-103%3A+Separation+of+Internal+and+External+traffic) 使用哪个侦听器的简介:
如前所述,客户端永远不会看到侦听器名称,并且会像以前一样发出元数据请求。不同之处在于它们返回的端点列表仅限于它们发出请求的端点的侦听器名称。
这很重要,因为这取决于您在 bootstrap.servers 配置中使用的 URL*,如果它被映射到 ads.listeners 中,客户端将返回的 URL*(如果监听器不知道行为是什么)不存在)。
还要注意这一点:
例外是基于 ZooKeeper 的消费者。这些消费者直接从 ZooKeeper 检索代理注册信息,并将选择第一个使用 PLAINTEXT 作为安全协议(它们支持的唯一安全协议)的侦听器。
作为一个示例代理配置(适用于集群中的所有代理):
advertised.listeners=EXTERNAL://XXXXX.compute-1.amazonaws.com:9990,INTERNAL://ip-XXXXX.ec2.internal:9993
inter.broker.listener.name=内部
listener.security.protocol.map=EXTERNAL:SSL,INTERNAL:PLAINTEXT
如果客户端使用 XXXXX.compute-1.amazonaws.com:9990 进行连接,则元数据提取将转到该代理。但是,与 Group Coordinator 或 Leader 一起使用的返回 URL 可能是 123.compute-1.amazonaws.com:9990*(不同的机器!)。这意味着匹配是在 KIP-103 所宣传的侦听器名称上完成的,而与实际 URL(节点)无关。
由于 EXTERNAL 的协议映射是 SSL,这将迫使您使用 SSL 密钥库进行连接。
另一方面,如果您在 AWS 中,那么您可以发出 ip-XXXXX.ec2.internal:9993 并且根据协议映射,相应的连接将是明文。
这在 IaaS 中尤其需要,在我的案例中,代理和消费者位于 AWS 上,而我的生产者位于客户端站点上,因此需要不同的安全协议和侦听器。
编辑:
由于您为不同的客户端(代理、生产者、消费者)提供了不同的端口,因此添加入站规则也变得更加容易。
编辑2:
如果以上内容还不清楚,这篇文章是一个很好的深度指南:https://rmoff.net/2018/08/02/kafka-listeners-explained/