Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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_Spring Boot_Apache Kafka_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Java 如何根据另一个主题的回复来阅读卡夫卡主题的信息

Java 如何根据另一个主题的回复来阅读卡夫卡主题的信息,java,spring-boot,apache-kafka,kafka-consumer-api,spring-kafka,Java,Spring Boot,Apache Kafka,Kafka Consumer Api,Spring Kafka,我在卡夫卡有两个主题:元数据和主数据。 我使用Kafka Listners实时读取数据。有两种情况: 我必须先阅读元数据主题,然后再阅读MasterData主题 也有可能元数据主题中没有新的消息,但主数据主题中插入了一条消息。在这种情况下,应继续使用MasterData主题 Ant建议如何实现这一点???在评论中澄清后,我理解,这是您想要实现的: 您有一个类似数据库的系统,kafka主题中的元数据用于调整表结构。然后,实际数据进入主卡夫卡主题,然后您希望将其插入表中。换句话说:您希望使用kafk

我在卡夫卡有两个主题:元数据和主数据。 我使用Kafka Listners实时读取数据。有两种情况:

  • 我必须先阅读元数据主题,然后再阅读MasterData主题
  • 也有可能元数据主题中没有新的消息,但主数据主题中插入了一条消息。在这种情况下,应继续使用MasterData主题

  • Ant建议如何实现这一点???

    在评论中澄清后,我理解,这是您想要实现的:

    您有一个类似数据库的系统,kafka主题中的元数据用于调整表结构。然后,实际数据进入主卡夫卡主题,然后您希望将其插入表中。换句话说:您希望使用kafka定义数据的结构

    我不确定,这是否就是我所说的卡夫卡的常规用例,因为它是用来交换事件(也称为数据)的接口。您试图做的是将系统用作定义数据结构的一种手段。但这只是我的意见

    正如前面在评论中所说,实际上没有办法说一个主题中没有信息。你只能说:现在还没有消息。您“可能”要做的是:当
    master
    主题中的消息到达时,您首先检查
    meta
    主题(如果也有消息)。如果存在,则应用数据结构中的更改,然后从主主题导入消息

    另一种选择是使用卡夫卡流而不是原始消费者 将两个主题结合在一起,例如使用
    join

    无论如何,要定义数据结构,人们通常会使用类似Avro的东西,它为您提供了模式演变等功能。然后编写应用程序以了解模式更改,并相应地将其应用于数据库表

    更新:如何使用卡夫卡流解决问题

    如上所述,卡夫卡流的使用将是您案例的一个可能解决方案。让我解释一下,我在一些伪卡夫卡流代码中的意思:

    import org.apache.kafka.streams.StreamsBuilder;
    导入org.apache.kafka.streams.kstream.GlobalKTable;
    导入java.nio.charset.StandardCharset;
    /**
    *只是一个不完整的卡夫卡流代码演示,展示了如何解决这个问题
    *可以用这个框架来解决,而不是直接使用消费者。
    *不包括卡夫卡流样板代码。
    */
    公开课范例{
    私有静态最终字符串META\u TOPIC=“META”;
    私有静态最终字符串MASTER\u TOPIC=“MASTER”;
    //您必须确保,元数据存储在下面
    //元主题中的特定键。
    私有静态最终字节[]META_KEY=MetaEvent.class.getName().getBytes(StandardCharsets.UTF_8);
    公共静态void main(字符串[]args){
    新示例().createTopology();
    }
    公共void createTopology(){
    最终StreamsBuilder生成器=新StreamsBuilder();
    最终的GlobalKTable元表=builder.globalTable(元主题);
    builder.stream(MASTER_主题)
    .leftJoin(
    元表,
    (k,v)->元键,
    MasterWithMeta::新建)
    .foreach(此::handleEvent);
    }
    私有void handleEvent(字节[]键,MasterWithMeta MasterWithMeta){
    //1)检查meta是否已更改,如果已更改,请将更改应用于数据库
    //2)将基础数据导入数据库
    }
    }
    使用Meta的类Master{
    私人决赛大师赛大师;
    私有最终元事件元;
    公共主事件getMaster(){
    返回主机;
    }
    公共元事件getMeta(){
    返回元;
    }
    公共MasterWithMeta(MasterEvent master,MetaEvent meta){
    this.master=master;
    this.meta=meta;
    }
    使用元创建公共静态主控(主事件主控、元事件元){
    返回新的MasterWithMeta(master,meta);
    }
    }
    类元事件{
    // ...
    }
    班级大师赛{
    // ...
    }
    
    标准是什么:好的,元数据中似乎没有任何内容,我继续使用MasterData?我的意思是,你在一个流媒体环境中。你想等一段时间吗?@Janhold不,我不想等。这些信息将被实时读取。元数据基本上为表提供元数据,而MasterData提供值。所以,如果表结构有任何变化,我将在元数据主题中包含一条消息,应该首先阅读它。但是如果表中没有变化,那么元数据中就不会出现消息。MasterData主题中只会出现新值。我更新了答案。也许我们可以聊天,这会更容易澄清,你真正想要达到的目标。当然我们可以聊天。但是怎么办呢?我在这里开了一个聊天室:让我这样问我的问题。是否可以使用KafkaListeners检查是否已从主题中读取了最新消息。您可能可以检查,如果您当前的消费者滞后,如果它为零,则您会说,好的,没有更多内容可阅读,但这并不意味着在5毫秒内该主题没有其他更新。另一种选择是,手动设置消费者补偿,但这似乎既不实用,也不是使用卡夫卡的缩进方式。但是,如果使用像Kafka Streams这样的框架,您将有机会将两个主题连接在一起,并将元主题视为一个表,在该表中,您只能在主数据上获取加入元时出现的最新记录。我更新了我的答案,以显示如何使用Kafka Streams解决此问题。你可以试一试。