繁体   English   中英

Spring Kafka:Kubernetes 内部消费者之间的负载均衡

[英]Spring Kafka : Load Balancing between Consumers inside Kubernetes

关于在 Kubernetes 中部署的 SpringBoot Kafka 应用程序以及如何负载平衡的小问题,请问。

背景:我曾经有一个非常简单的 SpringBoot Web 应用程序,通过 http 公开,只是做一个相当复杂和冗长的计算。

@RestController
public class HelloHttp {

    @Autowired BusinessService businessService;

    @GetMapping("/business")
    public String veryComplicatedAndTimeConsumingBusinessLogic(@RequestBody String request) {
        return businessService.veryComplicatedAndTimeConsumingBusinessLogic(request);
    }

随着这个网络应用程序越来越受欢迎,越来越多的客户在使用它,我们决定将它容器化,并将其部署在 Kubernetes (AWS) 中。 我们使用 Kubernetes 部署/副本集创建了 5 个副本。 然后我们创建了一个 Kubernetes 服务类型的负载均衡器,就像变魔术一样,我们可以看到请求在 5 个副本之间进行负载均衡。 意思是,一个 pod 将处理一个请求,然后另一个 pod 将处理下一个请求,等等......

发生了一些组织变化,而不是客户端发送请求 http 样式,他们现在都将有效负载放在 Kafka 中。 (问题不在于这种选择的合法性)。

然后,我们使用 Spring Kafka 将这个 Web 应用程序迁移到如下所示:

public class HelloKafka {

    @Autowired BusinessService businessService;

    @KafkaListener(topics = "businessTopic")
    public void veryComplicatedAndTimeConsumingBusinessLogic(String message) {
        businessService.veryComplicatedAndTimeConsumingBusinessLogic(message);
    }

我们只知道 Kafka 主机,主题(没有关于消费者组的信息?)

尽管如此,就像魔术一样,在单个实例上,我们可以看到应用程序使用来自 Kafka 的消息并处理它们。

由于负载仍然相同,我们决定再次在 Kubernetes 中部署相同的负载,使用部署 + 副本集 + 服务类型 Load Balancer。

然而,很奇怪的是,我们根本没有观察到负载均衡机制。

请问我错过了什么吗?

谢谢

没有关于消费者群体的信息?

你自己定义。 groupId@KafkaListener的参数。

我们根本没有观察负载平衡机制

这不是 Kubernetes 的问题。 Kafka 消费者不“分配负载”。 相反,同一消费者组中的所有消费者(同样,您设置的东西)都被分配到主题中的各个分区。

所以,要么

  • 如果您没有设置groupId ,它可能由 Spring 自动生成,并且每个实例都在读取所有分区
  • 你的主题有一个分区(这是默认的,如果它们是自动创建的); 因此组中最多只有一个消费者可以阅读该主题
  • 上游生产者只将数据发送到一个分区,因此只有一个消费者正在读取它,这是你无法控制的

这种选择的合法性

Kafka 通常被认为比带或不带副本的 HTTP 服务器具有更高的可用性。 它充当缓冲区以防止针对这些端点的 DOS 攻击。 另外,您可能不需要 HTTP 与纯 TCP 的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM