集群应用程序 - 一次只有一台服务器从卡夫卡读取,我错过了什么?
Clustered app - only one server at a time reads from kafka, what am I missing?
我有一个围绕 spring 工具构建的集群应用程序,使用 kafka 作为结构的消息层。在高层次上,它的体系结构是一个主进程,它将工作分配给单独 hardware/vm 上的从进程 运行。
Master
|_______________
| | |
slave1 slave2 slave3
我期望发生的情况是,如果我向 Kafka 发送 100 条消息,每个从属(在本例中为三个)将获取按比例的消息并执行按比例的工作(大约 1/本例中的第 3 个)。
真正发生的是一个从站接收所有的消息并执行所有的工作。不确定哪个 slave 将接收消息,但可以保证一个 slave 开始接收消息,其他 slave 将在 slave 完成其工作之前不会接收消息。
对我来说,从 Kafka 读取数据似乎是从队列中提取所有消息,而不是一次一个。这让我相信我错过了 Kafka 或 Spring kafka 中的配置。
我认为您没有从概念上理解什么是 Apache Kafka 及其工作原理。
首先,没有队列。消息在主题中解决。每个订阅的人都可以收到相同的消息。但是有一个消费群体的概念。因此,与订阅者的数量无关,如果消费者组相同,则只有其中一个订阅者会阅读一条消息。
Kafka 中还有一个功能叫做 partitions。有了它,您可以将消息分发到不同的分区中,或者它们将自动分配:默认情况下是均匀分配的。这个分区功能有另一个角度可以使用。当我们在同一个消费者组中有多个同主题的订阅者时,分区分布在他们之间。因此,您可能会重新考虑您的逻辑以支持 Apache Kafka 中的 built-in 功能。
不过,从 Spring Kafka 的角度来看,没有什么可做的。您只需要为合理数量的分区正确配置您的主题,并为所有 "slaves".
提供相同的消费者组
我有一个围绕 spring 工具构建的集群应用程序,使用 kafka 作为结构的消息层。在高层次上,它的体系结构是一个主进程,它将工作分配给单独 hardware/vm 上的从进程 运行。
Master
|_______________
| | |
slave1 slave2 slave3
我期望发生的情况是,如果我向 Kafka 发送 100 条消息,每个从属(在本例中为三个)将获取按比例的消息并执行按比例的工作(大约 1/本例中的第 3 个)。
真正发生的是一个从站接收所有的消息并执行所有的工作。不确定哪个 slave 将接收消息,但可以保证一个 slave 开始接收消息,其他 slave 将在 slave 完成其工作之前不会接收消息。
对我来说,从 Kafka 读取数据似乎是从队列中提取所有消息,而不是一次一个。这让我相信我错过了 Kafka 或 Spring kafka 中的配置。
我认为您没有从概念上理解什么是 Apache Kafka 及其工作原理。
首先,没有队列。消息在主题中解决。每个订阅的人都可以收到相同的消息。但是有一个消费群体的概念。因此,与订阅者的数量无关,如果消费者组相同,则只有其中一个订阅者会阅读一条消息。
Kafka 中还有一个功能叫做 partitions。有了它,您可以将消息分发到不同的分区中,或者它们将自动分配:默认情况下是均匀分配的。这个分区功能有另一个角度可以使用。当我们在同一个消费者组中有多个同主题的订阅者时,分区分布在他们之间。因此,您可能会重新考虑您的逻辑以支持 Apache Kafka 中的 built-in 功能。
不过,从 Spring Kafka 的角度来看,没有什么可做的。您只需要为合理数量的分区正确配置您的主题,并为所有 "slaves".
提供相同的消费者组