什么是延迟处理事件的可行解决方案?

时间:2019-11-14 08:02:58

标签: apache-kafka architecture

给出系统,该系统正在使用来自Kafka的事件流,以便分析数据库中存储的某些记录。

在某些情况下,事件与某些条件匹配,这意味着相应的记录应在以后的晚些时候进行分析。

也许,实现此逻辑的最简单解决方案是将将来处理的时间戳记写入数据库,并定期执行某种选择以查找所需的记录以进行重新处理。

也许还有另一种更方便,可扩展的方法来做到这一点?看起来像另一个带有时间戳的事件流,当当前时间大于或等于事件的时间戳时可以处理该事件流,实现这种行为的选项是什么?

2 个答案:

答案 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。