Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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_Apache Kafka Streams - Fatal编程技术网

Java 简单可调结构

Java 简单可调结构,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,概念上 假设我有一个名为“地址”的主题,其中键是一个人的姓名(字符串),值是一个人的地址(字符串)。对此人地址的更新将是一条消息,其中姓名作为密钥,新地址作为值。因此,如果我只想要任何一个键的最新值,我想我会创建一个ktable。当我这么做的时候,这里到底发生了什么?卡夫卡是否创造了一个新的主题,实际上是ktable和截断旧值?或者我必须为当前地址创建一个新主题吗?还是完全是别的原因 实际上 我发现的所有示例和教程都使用了不推荐的方法,所以我希望有更新的方法。我目前的解决方案是阅读如下主题: f

概念上

假设我有一个名为“地址”的主题,其中键是一个人的姓名(字符串),值是一个人的地址(字符串)。对此人地址的更新将是一条消息,其中姓名作为密钥,新地址作为值。因此,如果我只想要任何一个键的最新值,我想我会创建一个ktable。当我这么做的时候,这里到底发生了什么?卡夫卡是否创造了一个新的主题,实际上是ktable和截断旧值?或者我必须为当前地址创建一个新主题吗?还是完全是别的原因

实际上

我发现的所有示例和教程都使用了不推荐的方法,所以我希望有更新的方法。我目前的解决方案是阅读如下主题:

final Properties config = new Properties();
//leaving out all the config.put() for readability

final Consumer<String, String> consumer = new KafkaConsumer<>(config);

consumer.subscribe(Collections.singletonList("addresses"));

try {
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(200);
        for (ConsumerRecord<String, String> record : records) {
            //do stuff
        }
    }
} finally {
    consumer.close();
}
final Properties config=new Properties();
//为了便于阅读,省略了所有config.put()
最终消费者=新卡夫卡消费者(配置);
consumer.subscribe(Collections.singletonList(“地址”);
试一试{
while(true){
ConsumerRecords记录=consumer.poll(200);
对于(消费者记录:记录){
//做事
}
}
}最后{
consumer.close();
}

这在一段时间内奏效,但现在我想要一个有状态的解决方案。有没有一种简单的方法可以在信息进入ktable时将其粘贴到ktable中?我不想过滤它或任何东西,我只想要任何条目来更新状态。提前感谢。

KTable
不会创建新主题。相反,它将源主题上的消息视为数据库中的upsert—如果是第一次看到密钥,则类似于插入新记录。如果这不是第一次,它将被视为对现有记录的更新。
KTable
可以用作Kafka流其他部分的输入,您也可以将该状态保存在本地存储中,并在应用程序的其他部分查询该K/V存储。

好的,请原谅我将其简化,但您的意思是KTable不一定存储在任何地方(即远程),但这仅仅是创建一个从流中拉入的数据编译,然后在必要时可以存储在本地吗?没错。它是流的一个特定视图(可以来自一个主题,也可以来自多个主题,并与流操作符一起粉碎)。默认情况下,KTable使用本地嵌入式RocksDB存储每个键的最新记录。输入主题应配置为压缩主题,以便不会丢失任何数据。(RocksDB在概念上是一个短暂的缓存,而主题是真相的来源。)如果失败,输入主题将用于在处理继续之前重新创建KTable存储。这在某种程度上可能会有所帮助:(注意,KSQL使用Kafka流作为其运行时)