Kafka:制作人怎么能只发送给某个消费者/群组ID

zzlelutf  于 2021-06-07  发布在  Kafka
关注(0)|答案(4)|浏览(439)

自从我开始使用Kafka以来,我注意到Kafka正在向每个消费者或群体广播信息。我怎样才能让制作人只向某个特定的消费者发送信息?我说的是一个主题系统谢谢

wlsrxk51

wlsrxk511#

Kafka制作者不会向Kafka消费者发送任何信息。
Kafka制作人将信息发布到特定的主题中。
每个kafka使用者进程都属于特定的groupid,并在特定的主题中注册。
然后使用者可以开始使用来自该特定主题的数据,这样,如果您希望使用者进程仅从一个主题获取数据,则只将其注册到一个主题。
在本例中,请参见如何在两个主题中注册消费者:

consumer.subscribe(Arrays.asList("fast-messages", "summary-markers"));

请记住,如果有两个单独的使用者进程使用相同的主题,并且它们属于不同的组(groupid),那么它们将带来相同的数据,因为它们根本不会共享偏移量。

iqih9akk

iqih9akk2#

kafka如何使用消息取决于主题和使用者组的分区数量。当使用者是侦听同一主题的同一使用者组的一部分时,每个使用者将接收来自一个或多个分区的消息,但与其他使用者接收的消息不同。例如:如果一个主题有4个分区(p1、p2、p3、p4)和3个消费者(c1、c2和c3)在同一消费者组中,那么在分区分配之后,您可以有:c1从p1和p2接收,c2从p3接收,c3从p4接收。如您所见,消费者不会收到与c1相同的消息(即c3不会收到来自p1和p2的消息)。如果您将使用者分配到不同的使用者组(因此c1到g1,c2到g2,c3到g3)监听同一主题(有4个分区),他们将得到所有相同的消息(c1来自p1、p2、p3、p4,c2和c3也是如此)。因此,不同的消费者群体允许发布/订阅机制(广播消息)。如果您希望生产者只向特定的客户发送消息,其中一种可能性是使用一个主题,该主题的number of partitions=number of consumers,然后不使用consumer group,而是直接分配,以便consumer可以请求从特定的分区获取消息(即c1只希望从p1获取消息)。在这种情况下,生产者需要发送一个消息到该分区,但。。。默认分区器(即循环)不会发生这种情况。您应该基于目标使用者编写自己的分区器,以便将消息发送到正确的分区(因此,如果您知道消息“m”应该转到c1,那么您应该有一个分区器逻辑,该逻辑能够从消息“m”获取信息,处理它并将p1作为目标,即c1侦听分区)。另一个简单的解决方案可能是有一个主题-每个使用者有一个分区。你可以用不同的方法去做,但是Kafka,总的来说,没有你的努力是做不到的。

toiithl6

toiithl63#

创建“分区数=使用者数”
使用密钥发布消息,或者将消息发布到特定分区并使用相同的密钥。
这样你就可以实现你想要的

niknxzdl

niknxzdl4#

每个使用者选择从给定的主题中提取消息。如果您不希望使用者接收来自给定主题的消息,那么只需将其配置为不从该主题提取消息。
如果您想过滤一个主题以生成一个只有特定消息的主题,以便只使用这些消息,那么可以使用kafka streams或ksql来完成这一操作。

相关问题