Kafka 是否与使用反向代理的负载均衡器一起工作?

Does Kafka work with load balancers using reverse proxies?

最近我发现一些 articles/projects 在 Kafka 前面使用反向代理负载平衡器(即 https://github.com/banzaicloud/kafka-operator)。

直到今天,我虽然对 Kafka 的原理和架构很了解,因为我认为 Kafka 使用客户端平衡和一致性哈希,所以每个客户端都知道哪个分区掌握在哪个代理上,并直接与适当的代理通信。 Kafka 甚至有通知生产者和消费者有关重新分区和其他拓扑更改的协议,所以我真的认为 Kafka 应该在没有任何负载平衡器的情况下使用。当我们在操作过程中遇到问题时,收到关于生成无效 broker/partition 的异常甚至向我证明了这一点。

那么Kafka前面的那些代理和负载均衡器是什么意思呢?

你没有看错!你提到的所有内容都是正确的。

如果我们谈论的是“经典”负载均衡器,您需要满足以下 2 个条件才能将其与 Kafka 一起使用:

  1. 负载均衡器处于 TCP 级别(不能将 L6 或 L7 负载均衡器与 Kafka 一起使用)
  2. 每个 Kafka Broker 一个负载均衡器(正如您提到的,客户端直接连接到与之有业务往来的 Broker)

您提到的文章可能与 Envoy Kafka Filter(包括 Banzai)有某种关联。

我不知道内部细节,但我想我可以做一个总结。动态路由的主要挑战是 Kafka 协议,它是 TCP 级别的协议。因此,我们无法像在 higher-level 协议(例如:HTTP)的情况下那样访问元数据,因此我们无法正确路由通信。

Envoy 开发了一个 Kafka Filter 来实现这一点。当客户端连接到代理时,代理可以解码 Kafka 协议并且它知道“好的,所以你想连接到 x 代理,让我为你做”。