如何在KTable中动态查找?

时间:2020-08-10 15:56:58

标签: apache-kafka apache-kafka-streams

我目前正在开发一个Kafka Streams应用程序,该应用程序会使用来自我们数据库的数据来丰富传入事件。丰富数据存储在使用Debezium不断更新的主题中。 一些充实非常容易实现,因为它们只是事件ID的等联接/左联接。 但是其他充实要求从传入事件时间戳计算值:

假设我的传入事件主题具有以下架构:

user_id: Long
timestamp: Instant

然后我需要将此事件映射到以下输出:

user_id: Long
has_planned_meetings_in_the_future: Boolean

会议表存储在一个单独的主题中,具有以下记录结构:

user_id: Long
meeting_date: Instant

因此,对于每个事件,如果它们是该特定用户的记录且会议日期大于当前时间戳记,则需要在会议主题中进行查找。

该怎么做?

1 个答案:

答案 0 :(得分:2)

一种可行的方法是在应用程序中使用会议主题,并将会议存储在状态存储中。

然后您可以使用所描述的条件来高效地查询状态存储。

以下是存储会议的简单示例:

public class MyMeetingsProcessor implements Processor<Object, Meeting> {

    private String meetingsKeyStore = "meetings-key-store";
    private KeyValueStore<Object, Meeting> meetings;

    public void init(ProcessorContext context) {
        meetings = (KeyValueStore<Object, List<String>>) context.getStateStore(meetingsKeyStore);
    }

    public void process(Object key, Meeting value) {
        meetings.put(key, value);
    }
}

要在使用事件时查询状态存储,可以执行以下操作:

public class MyEventsProcessor implements Processor<Object, Meeting> {

    private String meetingsKeyStore = "meetings-key-store";
    private KeyValueStore<Object, Meeting> meetings;

    public void init(ProcessorContext context) {
        meetings = (KeyValueStore<Object, List<String>>) context.getStateStore(meetingsKeyStore);
    }

    public void process(Object key, Event value) {
        Meeting meeting = meetings.get(key);
        if (meeting != null) {
            // do something fun
        }
    }
}