kafka主题和分区决策

时间:2016-07-13 06:16:29

标签: apache-kafka

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

  1. 当我在一台主机上有一个kafka代理时 - 是否有任何意义让它拥有多个主题分区?我的意思是即使我的数据可以用一些密钥(比如租户ID)来区分 - 在单个kafka经纪商上做这件事有什么好处?这会给出任何并行性,如果是这样的话?
  2. 使用密钥时,这是否意味着每个密钥都映射到给定的分区?主题的分区数是否必须等于我指定的密钥的可能值的数量?或者这只是一个哈希,所以分区的数量不必相等?
  3. 根据我的阅读,主题是由于kafka中的消息类型而创建的。但在我的情况下,我有2个主题,因为我有两种类型的消费:一个用于逐个阅读消息。第二个是大量消息进入队列(应用程序原因),然后进入第二个主题。虽然消息类型相同,但这是一个好的设计吗?这种扩张的任何其他做法?

1 个答案:

答案 0 :(得分:3)

  1. 是的,即使您拥有一个Kafka代理,对某个主题拥有多个分区也是有意义的。您可以从中受益的情况非常简单:
    • 您需要保证租户ID
    • 的按顺序处理
    • 每条消息的处理逻辑相当复杂,需要一些时间。特别是当Kafka消息本身很简单的情况,但处理此消息的逻辑需要时间(简单的例子 - 消息是一个URL,处理逻辑从那里下载文件并进行一些处理)
  2. 鉴于这两个条件,如果所有数据都转到单个分区,您可能会遇到一个消费者无法继续处理所有消息的情况。请记住,您可以只使用一个消费者处理一个分区(如果使用不同的消费者群体,您可以使用2个消费者,但事实并非如此),因此随着时间的推移您将开始落后。但是,如果您有多个分区,您将能够使用一个消费者并并行处理数据(这可能有助于在某些情况下加快速度)或者只是添加更多消费者。

    1. 默认情况下,Kafka使用基于散列的分区。这可以通过提供自定义分区程序进行配置,例如,如果您不关心邮件的最终分区,则可以使用随机分区。

    2. 完全由您决定

    3. 的主题

      UPD,评论中的问题答案:

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

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

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