Kafka 流 - 当事件发生的时间相差很远时加入流

Kafka streams - Joining streams when events could happen far apart in time

我想就如何针对 Kafka Streams 的以下问题制定解决方案征求您的意见。

一个应用程序有主题和课程,它会触发以下事件:

LessonCreated      SubjectCreated     LessonAddedToSubject   LessonRemovedFromSubject
 +----------+     +--------------+     ---------------+         +--------------+
 | Id  Hours|     |      Id      |     |Lesson|Subject|         |Lesson|Subject|
 | ---+---- |     +--------------+     +--------------+         +--------------+
 | 25 | 20  |     |      1       |     |  25  |   1   |         |  25  |   1   |
 | 26 | 40  |     |      2       |     |  26  |   1   |         |  26  |   2   |
 | 27 | 10  |     |      3       |     |  26  |   2   |         +------+-------+
 +----+-----+     +--------------+     |  26  |   3   |         
                                       |  27  |   3   |         
                                       |  27  |   1   |         
                                       +------+-------+

我想实现一个流,将这些流加入到以下结构中:

   LessonSubjectHours
 ---------------------+
 |Lesson|Subject|Hours|
 +--------------------+
 |  26  |  1    | 40  |
 |  26  |  3    | 40  |
 |  27  |  3    | 10  |
 |  27  |  1    | 10  |
 +--------------------+

我想过用连接操作做一些逻辑,但我认为这可能无济于事,因为 KStream-KStream 连接似乎是强制时间窗口的(如果我理解正确的话)。这是因为 lessonCreated、lessonAdded 和 lessonRemoved 事件可能在时间上无限远地发生。因此,恐怕当其中一个事件在包含相同键的最后一个事件发出后发生的时间过长时,窗口连接可能会导致错误的结果。

虽然对联接进行完整查找不应该成为性能问题,因为这些事件不应该经常发生。但是,我仍然不知道如何继续,假设可以在 Kafka Streams 中正确处理这个问题。所以任何建议将不胜感激。

提前谢谢你。

PS:如果有帮助,仍然可以更改事件及其包含的数据。

看来你的数据基本上是表格形式的。因此,我想知道将主题阅读为 KStream 是否真的是正确的方法,您是否应该将数据处理为 KTable?对于这种情况,您可以 table-table 加入。

具有本地状态的表(RocksDb 很快)将是正确的选择。