Kafka分区和吞吐量

时间:2019-02-26 17:52:34

标签: apache-kafka

我对kafka有介绍性的经验,我正在尝试探索其细节。

我试图了解kafka分区如何帮助提高吞吐量;我在网上找到的所有信息中;据解释,更多的分区意味着更多的并行流;这是有道理的。

但是从不同的角度来看却没有。

让我说我有两个使用者,它们以给定主题每秒10条消息的速度使用数据。现在,他们不再从单个分区或两个不同的分区中使用它们了;我的吞吐量将保持每秒20条消息不变。

我觉得我必须丢失一些内部工作细节,您可以通过解释kafka分区(多个)如何帮助提高固定数量的消费者与单个kafka分区的吞吐量来帮助我。

2 个答案:

答案 0 :(得分:1)

我认为您的第一个误解是

  给定主题每秒

10条消息。

在卡夫卡,话题并不是真正的具体事情。相反,您应该将其视为具有相同名称和配置的分区的集合。

然后进入

  

让我说我有两个使用者,它们以给定主题每秒10条消息的速度使用数据。现在,他们不再从单个分区或两个不同的分区中使用它们了;我的吞吐量将保持每秒20条消息不变。

这并不完全正确,尤其是考虑到Consumer Groups这是Kafka的关键功能时。

如果只有一个分区,则同一组中不能有多个使用者同时使用。如果您的使用者位于不同的组中,则每个使用者都将收到所有消息。通过具有多个分区,您可以使多个使用者同时运行。

例如,对于2个分区,您可以在同一组中运行2个使用者,使用者1从分区0接收记录,使用者2从分区1接收记录。如果只有一个分区,则只有1个使用者可以使用(每个组) )。

此外,分区可以位于不同的代理上,这又有助于扩展性。

答案 1 :(得分:1)

https://kafka.apache.org/intro

当我开始学习卡夫卡时;我有同样的问题。以下说明将帮助您回答问题:

假设您有一个主题A,其中包含三个分区:X,Y和Z。

首先要了解的是如何在分区之间分配数据:

生产者可以选择将消息放入哪个分区。因此,您的生产者可以将消息#1发送到分区X,将消息#2发送到分区Y,将消息#3发送到分区Z。同样,其他生产者可以选择在其中写入分区数据。如果您的生产者没有选择分区,那么kafka将为您选择。了解更多信息;请签出生产者API。生产者永远不要将消息#1推到分区X,分区Y和分区Z。您可以创建副本以提供容错功能。 分区不是副本

现在,消费者订阅了您的主题。 Kafka将看到一个消费群体中有多少活跃的消费者。它可以按以下方式将分区分配给使用者:

Kafka partition distribution

(在图像中; P0,P1,P2和P3是分区。使用者组A具有C1和C2使用者。C1侦听P0,P3和C2侦听P1和P2。最后,您的使用者组A将从所有分区接收数据。)

  1. 如果您的消费者组有3个消费者,并且您添加了一个新消费者,那么它将非常理想。 消费者组中的消费者数量<=分区数
  2. 如果您的消费者组有2个消费者,并且您添加了一个新消费者,则将触发重新平衡。 Kafka将为您的使用者分配一个分区。
  3. 如果这是全新的消费者组,那么kafka会将所有分区分配给该新消费者。

现在让我们假设;您的使用者是单线程的,处理一条消息大约需要1秒,那么在情况3中,您的吞吐量将是1 msg /秒。

在案例2中;这将是3 msg /秒。因为每个使用者都在听不同的分区并处理数据。

在情况1中;你不会有任何好处。