将Kafka分为单独的主题或单个主题/多个分区

时间:2019-08-28 14:44:29

标签: apache-kafka kafka-topic kafka-partition

和往常一样,看到拆分方法相对于其他方法的好处有点令人困惑。

  1. 我看不到有之间的区别/优点
    • Topic1 -> P0Topic 2 -> P0
    • Topic 1 -> P0, P1
      并从2个主题或单个主题/ 2个分区中抽取消费者,而P0P1将拥有不同的事件类型或实体。

我能看到的另一个好处是,另一个消费者是否需要主题2数据,那么它很容易消费

  1. 关于主题自动生成,这种方式有什么好处,或者一段时间后会失去控制?

谢谢

2 个答案:

答案 0 :(得分:2)

  1. 我会说这个决定取决于多个因素;

    • 逻辑/关注点分离:您可以根据要实现的逻辑来决定是否在多个分区上使用多个主题。通常,您需要针对不同实体的不同主题。例如,假设您要流userscompanies。创建具有两个分区的单个主题没有太大意义,其中第一个分区包含users,第二个分区包含companies。另外,对多个分区只有一个主题将不允许您实现例如users的消息排序只能通过使用键控消息来实现(具有相同键的消息位于同一分区中)。

    • 主机存储功能:分区必须适合主机的存储,而主题可以通过在整个Kafka集群中进行分区来分布多个分区。 Kafka Docs可以进一步说明这一点:

        

      日志中的分区有多种用途。首先,他们允许   日志的规模将超出可容纳在一台服务器上的大小。每   单个分区必须适合承载该分区的服务器,但是一个主题   可能有许多分区,因此它可以处理任意数量的数据。   其次,它们充当并行性的单元-稍后对此进行详细介绍。

    • 吞吐量::如果吞吐量很高,则为每个实体创建不同的主题并将它们拆分为多个分区更为合理,以便多个使用者可以加入使用者组。不要忘记,Kafka中的并行度是由分区(显然是活动的使用者)的数量定义的。

    • 保留策略:Kafka中的邮件保留功能适用于分区/段级别,并且您需要确保已将分区与您选择的所需保留策略结合使用将支持您的用例。

  2. 现在谈到您的第二个问题,我不确定您的要求是什么,这个问题与第一个问题有什么关系。当生产者尝试将消息写到不存在的Kafka主题时,如果auto.create.topics.enable设置为true,它将自动创建该主题。否则,将无法创建主题,并且生产者将失败。

      

    auto.create.topics.enable:启用服务器上主题的自动创建

同样,此决定应取决于您的要求和期望的行为。通常,在生产环境中,auto.create.topics.enable应该设置为false,以减轻任何风险。

答案 1 :(得分:2)

只需在Giorgos答案上添加一些内容即可:

  1. 通过选择第一种方法而不是第一种方法,您将失去Kafka提供的许多功能。其中一些功能可能是:每个代理的数据平衡,删除主题,消费者组,ACL,与Kafka Streams的联接等。

  2. 我认为可以将此标志与在数据库中自动创建表进行比较。在您的开发环境中这样做很方便,但是您永远都不想在生产中发生它。