kafka主题和分区决策

Pin*_*est 3 apache-kafka

我需要了解一些关于卡夫卡的事情:

  1. 当我在一台主机上有一个 kafka 代理时,让它拥有多个主题分区是否有意义?我的意思是,即使我的数据可以通过某些密钥(例如租户 ID)来区分 - 在单个 kafka 代理上执行此操作有什么好处?这是否提供任何并行性,如果是的话如何?
  2. 当使用密钥时,这是否意味着每个密钥都映射到给定的分区?主题的分区数量是否必须等于我指定的键的可能值的数量?或者这只是一个哈希,因此分区数量不必相等?
  3. 据我所知,主题是根据 kafka 中放置的消息类型而创建的。但就我而言,我创建了 2 个主题,因为我有两种类型的消费:一种用于逐条阅读消息。第二个是在大量消息进入队列的情况下(应用程序原因),然后将其输入到第二个主题中。尽管消息类型相同,但这是一个好的设计吗?对于这种扫描还有其他做法吗?

ser*_*jja 5

  1. 是的,即使您只有一个 Kafka 代理,为一个主题设置多个分区也绝对有意义。您可以从中受益的场景非常简单:
    • 您需要保证按租户ID按顺序处理
    • 每条消息的处理逻辑都比较复杂,需要一定的时间。特别是当 Kafka 消息本身很简单,但处理该消息背后的逻辑需要时间的情况(简单的例子 - 消息是一个 URL,处理逻辑是从那里下载文件并进行一些处理)

考虑到这两种情况,您可能会遇到这样一种情况:如果所有数据都进入单个分区,则一个消费者无法继续处理所有消息。请记住,您可以仅使用一个消费者来处理一个分区(当然,如果使用不同的消费者组,您可以使用 2 个消费者,但这不是您的情况),因此随着时间的推移,您将开始落后。但是,如果您有多个分区,您要么能够使用一个消费者并并行处理数据(这在某些情况下可能有助于加快速度),要么只是添加更多消费者。

  1. 默认情况下,Kafka 使用基于哈希的分区。这可以通过提供自定义分区器进行配置,例如,如果您不关心消息最终位于哪个分区,则可以使用随机分区。

  2. 主题的目的完全取决于你

UPD,回答评论中的问题:

  1. 添加更多消费者通常是为了增加更多计算能力,而不是为了实现所需的并行性。要添加并行性,请添加分区。大多数消费者实现在不同线程上处理不同分区,因此如果您有足够的计算能力,您可能只有一个消费者并行处理多个分区。然后,如果您开始遇到一个消费者不够用的情况,您只需添加更多消费者即可。

  2. 创建主题时,您只需指定分区数量(以及该主题的复制因子,但这是另一回事)。要发送的密钥和分区完全取决于生产者。事实上,您可以将生产者配置为使用随机分区器,它甚至不会关心密钥,只需随机选择分区即可。键 -> 分区之间没有直接关系,只是从这样的设置中受益很方便。

  3. 您能详细说明一下这一点吗?不确定我是否理解这一点,但我想你的问题是你是否可以只发送一个值,而 Kafka 会以某种方式自行推断出一个密钥。如果是这样,那么答案是否定的 - Kafka 不会对消息应用任何转换并按原样存储它们,因此如果您希望消息包含密钥,则生产者必须显式发送该密钥。