Kafka 会完全取代负载均衡器吗?

Does Kafka replaces the Load Balancers completely?

有人问我一个实现系统扩展的问题。系统本身处理客户数据并对数据进行过滤并生成一些分析信息。

1) 第一次迭代:

我最初的回答是提供Kafka集群方案。

Kafka 本身具有流式处理、负载均衡和容错能力。因此,它使我能够有效地创建处理许多代理中的生产数据,并根据需要在任何消费者中使用这些数据。

我还可以根据需要添加流式传输功能来过滤数据。

在这种情况下,无需考虑负载均衡器,因为 Kafka 会自行处理负载均衡。

2) 第二次迭代:有人问我,如果需求增长巨大,我该如何扩展系统。扩展系统的方法是什么?

在这种情况下,在考虑Kafka集群时;经纪人数量和分区应该在一开始就被描述。它不是某种自我扩张的东西。因此,尽管 Kafka 在考虑多个位置和快速增加的请求时提供了很大的灵活性,但我的第二个意见是使用 Elastic Load Balancer 和数据中心的自动绑定。

当请求在第二天翻倍时。负载均衡器将负载路由到其他负载均衡器/其他数据中心,因此在必要时新的 Kafka 集群会自动连接到整个系统。

主要负载路由可以在地理上完成。

尽管 Kafka 是如此强大的候选者,但负载均衡器这个问题的要点看起来仍然需要。

我的第二种方法类似于以下架构。

https://i.stack.imgur.com/kEx1C.jpg

(同时,在这次面试之前,我遇到了一些面试官,他们恰好将负载均衡器命名为"out of date technology",我被认为非常残酷,因为我建议使用负载均衡器。)

如果您是 Kafka 专家并且正在处理多地点不断增加的请求的扩展,如果您提出您的意见,我将很高兴。

谢谢。

虽然您可以将 TCP 负载均衡器放在 Kafka 代理前面,但这只会造成另一个故障点,IMO 毫无意义,因为客户端必须直接向分区领导者发送请求,而负载均衡器没有上下文除非配置为这样做。

来自 Kafka 协议文档

the client needs to somehow find one broker and that broker will tell the client about all the other brokers that exist and what partitions they host. This first broker may itself go down so the best practice for a client implementation is to take a list of two or three URLs to bootstrap from. The user can then choose to use a load balancer or just statically configure two or three of their Kafka hosts in the clients

HAProxy 或 Nginx 没有“过时”。你需要说这话的人说得更清楚

如果消息产量增加,则可以调整 Kafka 消费者设置以处理背压。仅当代理接近硬件限制时,才应添加更多资源(不仅在尖峰负载期间)

使用 Kafka 进行负载平衡会 运行 出现问题,因为客户端本身将创建到 Kafka 代理的多个连接,可能会绕过您的代理。 在启动时,客户端 (producers/consumers) 向 bootstrap.servers 发送 Metadata 请求以了解集群的外观。当您在 Java 客户端中打开 trace/debug 日志级别时,可以详细观察到这一点。

另一方面,网格级解决方案将需要协议支持,例如Envoy 中正在发生这样的事情 - https://github.com/envoyproxy/envoy/issues/2852

如果您的客户端是内部客户端,您可以在不使用任何为外部客户端提供支持的接口(例如 public 通过 HTTP 的接口)的情况下逃脱,因此您不需要任何 ALB 或 API 网关。但是,如果您需要支持外部客户端,使用负载均衡器来路由或引导繁重的流量可能是最明智的策略。您可以将负载直接交给负责处理的 lambda,或者您可以将其转储到 Kafka 以进行“扇出”(多个消费者处理消息)。这将取决于负载、用例和可重玩性。