Java 阿帕奇·卡夫卡消息广播

Java 阿帕奇·卡夫卡消息广播,java,apache-kafka,Java,Apache Kafka,我正在学习阿帕奇·卡夫卡,有些困惑。请帮助我理解以下场景 我有一个主题,在Kafka集群中有5个分区和5个代理。我在分区1(比如P1)中维护我的消息顺序。我想将P1的消息广播给10个消费者 所以我的问题是,;这10个消费者是如何与主题分区p1交互的。这可能不是您想要使用Kafka的方式 除非明确设置密钥的方式,否则在生成主题时无法真正控制消息最终位于哪个分区。卡夫卡中的分区设计得更像低级管道,一些存在的东西,但通常不需要与之交互。在消费者方面,将根据某个特定消费者组在任何时候的活动消费者数量为您

我正在学习阿帕奇·卡夫卡,有些困惑。请帮助我理解以下场景

我有一个主题,在Kafka集群中有5个分区和5个代理。我在分区1(比如P1)中维护我的消息顺序。我想将P1的消息广播给10个消费者


所以我的问题是,;这10个消费者是如何与主题分区p1交互的。

这可能不是您想要使用Kafka的方式

除非明确设置密钥的方式,否则在生成主题时无法真正控制消息最终位于哪个分区。卡夫卡中的分区设计得更像低级管道,一些存在的东西,但通常不需要与之交互。在消费者方面,将根据某个特定消费者组在任何时候的活动消费者数量为您分配分区

解决这个问题的一种方法是将主题定义为只有一个分区,当然,在这种情况下,所有消息都将转到该分区。这并不理想,因为卡夫卡无法并行化数据摄取或服务,但这是可能的

所以,话虽如此,让我们假设您确实设法将所有消息放在特定主题的分区1中。当您使用consumer group id为
consumer1
启动该主题的消费者时,它将被分配该主题的所有分区,因为该消费者是该特定组id的唯一活动分区。如果该主题只有一个分区,如上文所述,则该消费者将获得所有数据。如果您随后启动具有相同组id的第二个使用者,Kafka将注意到该特定组id有第二个使用者,但由于只有一个分区,它无法为其分配任何分区,因此使用者将永远不会获得任何数据

另一方面,如果您使用不同的消费者组id激活第三个消费者,比如说
consumer2
,那么该消费者现在将获得所有数据,并且不会干扰
consumer1
消息消费,因为卡夫卡会单独跟踪他们的消费偏移量。Kafka跟踪每个分区上每个特定ConsumerGroupId的偏移量,因此不会混淆其中一个是否开始缓慢消费或停止一段时间后重新消费

关于卡夫卡如何在这里工作的更多详细信息:

有关如何使用卡夫卡消费者的更多信息,请访问此链接:
@mjuarez的答案绝对正确——为了简单起见,我将其简化为以下内容:

不要尝试只从单个分区读取,因为它是一个低级别的构造,并且在某种程度上破坏了Kafka的并行性。如果需要更精细的数据分离,最好只创建更多的主题


我还要补充一点,大多数时候,消费者不需要知道消息来自哪个分区,同样,我也不会因为三明治来自哪个商店而吃不同的三明治。

@mjuarez实际上是不正确的,我也不知道为什么他的评论会被OP错误地证实。你完全可以明确地告诉卡夫卡制作人记录与使用以下分区有关:

ProducerRecord(
        java.lang.String topic,
        java.lang.Integer partition, // <--------- !!!
        java.lang.Long timestamp,
        K key,
        V value)
生产记录(
java.lang.String主题,

java.lang.Integer partition,//为什么要否决这个问题?我问这个问题,因为我没有找到任何关于这个问题的话题来澄清我的疑问。我还没有否决你的Q,但你的Q非常模糊。我的感觉是你在问一些与卡夫卡相关的非常基本的问题,这些问题可以在文档中找到。添加更多你所做的步骤到目前为止,你想要实现什么&你面临着什么问题需要任何人来帮助。所以问题是——你怎么能只使用某个主题的特定分区?卡夫卡不“广播”这一点也值得澄清因此,Kafka是一个发布/订阅队列,这意味着消费者注册他们对特定主题的兴趣,并在生成时检索它们。