当前位置: 首页 > 知识库问答 >
问题:

主题、分区和键

慕容灿
2023-03-14

Kafka只提供一个分区内消息的总顺序,而不提供主题中不同分区之间的消息的总顺序。每分区排序与按键对数据进行分区的能力相结合,对于大多数应用程序来说已经足够了。但是,如果您需要消息的总顺序,这可以通过只有一个分区的主题来实现,尽管这意味着每个使用者组只有一个使用者进程。

下面是我的问题:

>

  • 这是否意味着如果我希望有多个消费者(来自同一组)阅读一个主题,我需要有多个分区?

    1. 分区是如何编号的?从0开始还是从1开始?
    2. 密钥和分区之间到底有什么关系?据我所知,键上某些函数将决定一个分区。是这样吗?
    3. 如果我在一个主题中有两个分区,并且希望某些特定消息到一个分区,而其他消息到另一个分区,我应该对一个特定分区使用特定键,其余的用于另一个分区?
    4. 如果我有3个分区,将一种类型的消息发送到一个特定分区,而将其余的消息发送到其他2个分区,该怎么办?
    5. 通常情况下,我如何将消息发送到特定分区,以便了解使用者从何处读取?或者我最好有多个主题?

    提前道谢。

  • 共有1个答案

    杜阳泽
    2023-03-14

    伊戈尔,

    分区增加了Kafaka主题的并行性。任何数量的消费者/生产者都可以使用同一个分区。由应用层来定义协议。Kafaka保证交货。关于API,您可能希望查看Java文档,因为它们可能更完整。根据我的经验:

    1. 分区从0开始
    2. 键可用于向同一分区发送消息。例如,哈希(key)%num_partition。该逻辑可插入生产者。https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/producer/partitioner.html
    3. 是的。但是要注意,不要使用某些会导致“专用”分区的键结束。为此,您可能希望有专门的主题。例如,控件主题和数据主题
    4. 这似乎是与3相同的问题。
    5. 我认为消费者不应该基于分区对数据进行假设。典型的方法是拥有可以从主题的多个分区读取的消费者组。如果希望有专用频道,最好使用单独的主题(更安全/可维护)。
     类似资料:
    • Kafka主题分区偏移位置始终从0或随机值开始,如何确保使用者记录是分区中的第一条记录?有没有办法找出答案?如果有的话,请让我知道。谢谢。

    • 我开始学习Kafka用于企业解决方案。 在我阅读的过程中,我脑海中浮现出一些问题: > 当一个生产者正在生成一个消息--它会指定它想要将消息发送到的主题,是这样吗?它关心分区吗? 当订阅服务器运行时-它是否指定其组id,以便它可以是同一主题的使用者集群的一部分,或者是该组使用者感兴趣的几个主题的一部分? 每个消费者组在代理上有一个对应的分区还是每个消费者都有一个? 分区是由代理创建的,因此不是消费

    • 假设我有一个名为“MyTopic”的主题,它有3个分区P0、P1和P2。这些分区中的每一个都有一个leader,并且本主题的数据(消息)分布在这些分区中。 1.Producer将始终根据代理上的负载以循环方式写到分区的领导者。对吗? 2.制作人如何认识隔断的首领?

    • 简单问题: 假设我有一个具有3个分区的主题:Topic:StateEvents P1、P2和P3。 让我们假设生产者生成20条消息: 1, 2, 3, ..........20 我的问题是: 当制作人生成这些消息时: 1)每个消息将只在且仅在1个分区?也就是说,1在P1,2在P2,3在P3,然后4在P1,5在P2,6在P3,以此类推? 2)如果#1为真,当消费者订阅时,它将订阅所有分区,以便获得所

    • 我使用spring-kafka注释@kafkalistener来指定我的侦听器方法。 我使用单个分区的单个主题。消息永远不会超过一秒或两秒,所以单个线程是可以接受的。spring-kafka文档称@Kafkalistener默认使用ConcurrentMessageListenerContainer。使用SetConcurrency控制并发的正确方法是吗?

    • 通过Kafka文档和各种其他资源,我了解到Kafka中的消息被组织成主题。此外,主题可以分解为多个分区,每个分区可以托管在不同的服务器上。这提供了冗余和可伸缩性。 我不确定这里的“破碎”这个词是什么意思。这是否意味着,如果添加到主题的消息是,例如“1 2 3 4 5 6 7”,那么在将其分解为分区后,我们将有一个分区仅包含整个主题的子部分。就像一个分区有“1 2 3”,而另一个分区有“4 5 6”