负载均衡Kafka使用者多个实例

时间:2019-09-18 09:34:45

标签: spring-boot kubernetes apache-kafka load-balancing kafka-consumer-api

我有一个使用者,它可以读取消息并将消息写入时间序列数据库。我们有多个时间序列数据库实例,它们作为群集在多个物理计算机上运行。

我们的计划是在Kubernetes上部署使用者,以便在需要更多具有负载平衡的实例时进行扩展,它们都指向正在运行的单个时间序列服务。

现在我想到一个问题,即如果我有5个实例消耗相同的主题,那么它们将分别工作(它们都获得消息有效负载并像任何一个实例一样保存 >)

我们想要的是

我们希望如果一个使用者忙,那么它将转到下一个空闲实例,但不会被所有正在运行的实例所订阅。扩展或平衡负载意味着我想要像普通的负载平衡应用程序一样,或者像在Kubernetes上扩展时spring-boot应用程序一样工作

那么,有什么方法可以使它像负载平衡的使用者,并且只处理一个,甚至像普通应用程序一样,以1st或2nd或3rd的方式作为loadbanlacer使用?

如果有人对此有任何想法,如果使用Kafka Spring引导应用程序执行此操作,它将如何运行以及将获得什么样的输出?

1 个答案:

答案 0 :(得分:1)

因此,基本上,您需要使用Kafka Consumer Groups。

消费者组使Kafka可以灵活地利用消息队列和发布-订阅模型的优势。属于同一消费者组的Kafka消费者共享一个组ID。然后,通过确定每个分区仅由组中的单个使用者使用,组中的使用者就将主题分区尽可能公平地划分。

如果所有使用者都来自同一组,则Kafka模型的功能就像传统的消息队列一样。然后将所有记录和处理进行负载平衡。每个消息仅由组的一个使用者使用。每个分区最多可与一组中的一个使用者连接。

  

当存在多个消费者组时,数据消费模型的流程与传统的发布-订阅模型保持一致。这些消息将广播到所有消费者组。

enter image description here 还存在排他性消费者,恰好是只有一个消费者的消费群体。这样的使用者必须连接到它所需的所有分区。

理想地,分区的数量等于使用者的数量。如果使用方数量更多,则多余的使用方将处于闲置状态,浪费客户端资源。

  

如果分区数更多,则某些使用者将从多个分区中读取内容,除非消息的顺序对于用例很重要,否则这不是问题。

enter image description here

但是,请务必注意,Kafka不保证分区之间的消息顺序。它确实提供了分区内的排序。因此,如果Kafka仅订阅单个分区,则它可以维护使用者的消息排序。消息也可以在处理过程中使用要分组的键来排序。