KTable状态存储的持久性

时间:2018-07-20 03:26:46

标签: apache-kafka-streams

如果在实现KTable时使用永久存储,状态存储在应用程序重新启动时是否会永久存储?例如,如果我使用以下内容:

StreamsBuilder builder = new StreamsBuilder();
KeyValueBytesStoreSupplier storeSupplier =      Stores.persistentKeyValueStore("queryable-store-name");
 KTable<Long,String> table = builder.table(
   "foo",
   Materialized.as(storeSupplier)
               .withKeySerde(Serdes.Long())
               .withValueSerde(Serdes.String())

状态存储“ queryable-store-name”是否可以通过重新启动时先前运行的状态进行访问?可以说,我向主题foo发送了50条记录,并且在状态存储中实现了该记录。然后重新启动应用程序,我在状态存储中还会保留那50条记录吗?如果没有,有没有办法实现?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,状态存储默认情况下保留在磁盘上。重新启动应用程序且未更改application-id时,将从磁盘上恢复状态,其中包含所有50条记录。当应用程序被终止/停止/重新启动时,将从偏移量添加新记录。

编辑: 好像您在KTable上缺少聚合操作,这是必需的。参见我的代码示例:

final KStream<CustomerKey, ViewPage> viewPagesStream=builder.stream(INPUT_TOPIC);

final KTable<Windowed<ViewPageCountKey>,Long>uniqueViewPageCount=viewPagesStream
        .map((key,value)->{
            ViewPageCountKey newKey=new ViewPageCountKey(key.getProjectId(),value.getUrl());
            return new KeyValue<>(newKey,value);
        })
        .filter((key,value)->key!=null)
        .groupByKey()
        .count(TimeWindows.of(WINDOW_SIZE).advanceBy(WINDOW_ADVANCE),STORE_NAME);