将 Kafka 拆分为单独的主题或单个 topic/multiple 分区

Splitting Kafka into separate topic or single topic/multiple partitions

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

  1. 我看不到difference/Pros-Cons
    • Topic1 -> P0Topic 2 -> P0
    • 超过 Topic 1 -> P0, P1
      消费者从 2 个主题或单个 topic/2 分区中拉取,而 P0P1 将包含不同的事件类型或实体。

唯一的好处是我可以看到另一个消费者是否需要主题 2 数据,然后它很容易消费

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

谢谢

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

    • Logic/Separation 的关注点: 您可以根据您尝试实现的逻辑来决定是否在多个分区上使用多个主题。通常,不同的实体需要不同的主题。例如,假设您要流式传输 userscompanies。创建一个包含两个分区的主题没有多大意义,其中第一个分区包含 users,第二个分区包含 companies。此外,为多个分区设置一个主题将不允许您实现例如users 的消息排序只能使用键控消息实现(具有相同键的消息放置在同一分区中)。

    • 主机存储能力:分区必须适合主机的存储,而主题可以是通过将其划分到多个分区来分布在整个 Kafka 集群中。 Kafka Docs 可以进一步阐明这一点:

      The partitions in the log serve several purposes. First, they allow the log to scale beyond a size that will fit on a single server. Each individual partition must fit on the servers that host it, but a topic may have many partitions so it can handle an arbitrary amount of data. Second they act as the unit of parallelism—more on that in a bit.

    • 吞吐量:如果你有高吞吐量,为每个实体创建不同的主题并将它们分成多个分区以便多个消费者可以加入更有意义消费者群体。不要忘记 Kafka 中的并行级别是由分区的数量(显然还有活跃的消费者)定义的。

    • 保留策略: Kafka 中的消息保留在 partition/segment 级别上工作,您需要确保您结合进行的分区使用您选择的所需保留策略将支持您的用例。

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

    auto.create.topics.enable: Enable auto creation of topic on the server

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

只是在 Giorgos 回答之上添加一些东西:

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

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