给出系统,该系统正在使用来自Kafka的事件流,以便分析数据库中存储的某些记录。
在某些情况下,事件与某些条件匹配,这意味着相应的记录应在以后的晚些时候进行分析。
也许,实现此逻辑的最简单解决方案是将将来处理的时间戳记写入数据库,并定期执行某种选择以查找所需的记录以进行重新处理。
也许还有另一种更方便,可扩展的方法来做到这一点?看起来像另一个带有时间戳的事件流,当当前时间大于或等于事件的时间戳时可以处理该事件流,实现这种行为的选项是什么?
答案 0 :(得分:1)
您可以在Kafka Stream中尝试使用stateStore。流处理应用程序可以使用它稍后存储和查询数据。
当您调用count()或gregation()之类的有状态运算符时或在对流进行窗口化时,Kafka Stream会自动创建和管理此类状态存储。它将存储在内存中,但您可以将其存储在某些内存中持久存储的地方portworx处理故障情况。
下面显示了如何初始化StateStore
StoreBuilder<KeyValueStore<String, String>> statStore = Stores
.keyValueStoreBuilder(Stores.persistentKeyValueStore("uniqueName"), Serdes.String(),
Serdes.String())
.withLoggingDisabled(); // disable backing up the store to a change log topic
下面显示了如何在Kafka Stream中添加状态存储
Topology builder = new Topology();
builder.addSource("Source", topic)
.addProcessor("SourceProcessName", () -> new ProcessorClass(), "Source")
.addStateStore(statStore, "SourceProcessName")
.addSink("SinkProcessName", sinkTopic, "SourceProcessName");
处理方法中,您可以将Kafka主题消息存储为键,值
KeyValueStore<String, String> dsStore = (KeyValueStore<String, String>) context.getStateStore("statStore");
KeyValueIterator<String, String> iter = this.dsStore.all();
while (iter.hasNext()) {
KeyValue<String, String> entry = iter.next();
}
答案 1 :(得分:1)
在我看来,取决于您需要存储多长时间,您可以仅创建一个流来过滤这些事件并将其推送到一个新主题中,以便稍后进行处理。如果更多的是出于历史目的,那么最好将其推入DBMS。