我目前正在开发一个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
因此,对于每个事件,如果它们是该特定用户的记录且会议日期大于当前时间戳记,则需要在会议主题中进行查找。
该怎么做?
答案 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
}
}
}