繁体   English   中英

kafka主题和分区决策

[英]kafka topics and partitions decisions

我需要了解一些有关kafka的信息:

  1. 当我在单个主机上只有一个kafka代理时-是否有多个主题可以分区? 我的意思是,即使我的数据可以用一些密钥(例如,租户ID)加以区分-在单个kafka经纪人上进行交易有什么好处? 这会带来任何并行性吗?
  2. 使用密钥时,是否意味着每个密钥都映射到给定的分区? 主题的分区数是否必须等于我指定的键的可能值数? 还是这只是一个哈希,所以分区数不必相等?
  3. 根据我的阅读,主题是由于要在kafka中放置的消息类型而创建的。 但就我而言,由于有两种消费类型,因此我创建了2个主题:一种用于阅读一条消息。 如果有大量消息,第二个进入队列(应用程序原因),然后将其输入第二个主题。 尽管消息类型相同,这是一个好的设计吗? 还有其他做法可以解决吗?
  1. 是的,即使您只有一个Kafka经纪人,一个主题有多个分区绝对是合理的。 您可以从中受益的情况非常简单:
    • 您需要保证按租户ID进行顺序处理
    • 每个消息的处理逻辑相当复杂,并且需要一些时间。 特别是当Kafka消息本身很简单,但是处理该消息的逻辑需要时间时(简单的示例-消息是一个URL,并且处理逻辑是从那里下载文件并进行一些处理)

给定这两个条件,您可能会遇到这样一种情况,即如果所有数据都进入单个分区,那么一个使用者将无法继续处理所有消息。 请记住,您可以只用一个使用者处理一个分区(当然,如果使用不同的使用者组,则可以使用2个使用者,但事实并非如此),所以随着时间的流逝,您将开始落后。 但是,如果您有多个分区,则要么可以使用一个使用者并并行处理数据(在某些情况下这可以帮助加快处理速度),要么可以添加更多使用者。

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

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

UPD,评论中问题的答案:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM