Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡-将消息分配给特定的消费群体_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 卡夫卡-将消息分配给特定的消费群体

Java 卡夫卡-将消息分配给特定的消费群体,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我有一个关于Kafka组ID的小问题,我可以在Java中使用以下注释: @KafkaListener(topics = "insert", groupId = "user") 在那里,我可以设置一个它想要使用的groupId,但我不会只使用这个组id,可能是因为我不能发送到特定的组id。我如何只发送到一个特殊的groupId?关于我可以使用GroupID的内容,或者我需要设置发送卡夫卡消息的特定主题 我已经试着在网上找到答案了,但是我什么也没找到

我有一个关于Kafka组ID的小问题,我可以在Java中使用以下注释:

    @KafkaListener(topics = "insert", groupId = "user")
在那里,我可以设置一个它想要使用的groupId,但我不会只使用这个组id,可能是因为我不能发送到特定的组id。我如何只发送到一个特殊的groupId?关于我可以使用GroupID的内容,或者我需要设置发送卡夫卡消息的特定主题

我已经试着在网上找到答案了,但是我什么也没找到,也许我用的是google false哈哈

我希望所有人都能理解我,如果不是,请提问:)


已经有很多了

欢迎来到卡夫卡!首先:你不能发送到消费群体,你只能发送到
主题


下面的文字太多。阅读整个答案时,请注意可能出现的睡意。
如果你还在读这篇文章,我想你真的想知道如何将信息发送给特定的客户,或者你真的需要尽快睡一觉。 也许两者都有。以后不要开车


回到你的问题。

从该主题中,多个
消费群体可以阅读。每个
CG
都是独立的,因此每个人都会自始至终地阅读主题。把一个
CG
想象成一个内恐惧症消费者的联盟:他们不会关心其他群体,他们不会与其他群体交谈,他们甚至不知道是否存在其他群体

通过使用不同的方法和/或体系结构,我可以想出三种不同的方法来实现您的目标。唯一使用
消费群体的是第一个,但其他两个也可能有用:

  • 订阅
  • 分配
  • 多主题
前两个基于在单个主题中划分消息的机制。第三种方法只能在某些情况下成立。让我们进入这些选项


1.

您可以创建一个新主题,用消息填充它,并添加一些元数据,以便识别谁需要处理每条消息(该消息指向谁)

存储在卡夫卡中的消息除其他字段外,还包含一个
和一个
(消息本身)

假设您只希望
GROUP-A
处理一些特定的消息。一个简单的解决方案是在键上包含一个标识符,例如后缀。其中一个键可能看起来像:
键#GA

在消费者方面,您可以
poll()
从该主题中获取消息,并在处理之前添加一点额外的条件逻辑:您只需读取密钥并检查后缀。如果它与指定的消费者组对应,在这种情况下,它包含
GA
,则
A组的消费者知道它必须处理该消息

例如,您的主题存储两种不同性质的消息,您希望将它们定向到两个组:
GROUP-A
GROUP-Z

     key    value
 - [11#GA][MESSAGE]
 - [21#GZ][MESSAGE]
 - [33#GZ][MESSAGE]
 - [44#GA][MESSAGE]
两个消费群体都会对这4条消息进行投票,但每个群体只会处理其中的一些消息

  • A组将丢弃第2条和第3条消息它将处理第1个和第4个。

  • Group-Z
    将丢弃第一条和第四条消息它将处理第二个和第三个。

这基本上是你的目标,但使用一些额外的逻辑和玩卡夫卡的架构。带有特定后缀的消息将被“定向到”特定的消费者群体,并被其他消费者群体忽略


2.

上述解决方案的重点是消费者群体和卡夫卡的
subscribe
方法。另一种可能的解决方案是使用卡夫卡的
assign
方法,而不是订阅消费群体。此处不涉及
ConsumerGroup
,因此将引用前面的组以避免任何混淆

Assign
允许您直接指定消费者必须阅读的主题/分区

在生产者端,您应该使用自己的逻辑对消息进行分区,以便在主题内的分区之间进行分区。一些关于自定义分区的更深入的信息(是的,链接中的作者看起来像一个彻底的傻瓜)

例如,假设您有5种不同类型的
消费者。因此,您创建了一个
主题
,其中包含5个分区,每个“组”对应一个分区。您的
生产者
的自定义分区器为每条消息标识相应的分区,本主题将在生成上一示例中的消息后呈现此结构:

为了将消息定向到相应的“组”:

  • “Group-Z”
    分配到第五个分区
  • “A组”
    分配了第一个分区
此解决方案的优点是浪费的资源更少:每个“组”只轮询自己的消息,当验证每个消息都指向轮询它的消费者时,您可以避免丢弃/接受逻辑:线路上的通信量更少,内存中的对象更少,cpu工作更少

disadvatange包含一个更复杂的卡夫卡制作人机制,该机制涉及一个自定义的分区器,该分区器应该根据数据或主题结构的变化不断更新。此外,这还将导致在每次更改生产方时更新您的消费者定义的分配


体育