当我们必须动态获取数据时,卡夫卡流富集

时间:2018-02-07 16:17:26

标签: apache-kafka apache-kafka-streams

我们有一系列传入的事件:

{ user: 123, itemid: 'abc', ... }
{ user: 456, itemid: 'abc', ... }
{ user: 123, itemid: 'def', ... }
{ user: 789, itemid: 'xyz', ... }
{ user: 123, itemid: 'xyz', ... }

等等。我们需要通过项目ID(Web服务调用)查找的数据来丰富这些内容,但是 查找可能很慢。另一方面,项目数据非常静态, 所以将它缓存一天不会有问题。

现在,标准解决方案是将项目数据发布到KTable并加入,但...... 我们无法获得所有项目 - 我们从后端系统获得这些项目,而不能只是做“全部”。 并且不会有更新通知。想象一下,项目ID是书籍ISBN号码 - 我们不能要求列出世界上所有的书籍。书籍信息只会缓慢变化 (例如,某人修复了分类错误),我们无需为此类更改重新发布事件。

那么,我们该怎么做呢? 我目前的想法是我们在itemid上进行分区,使用项目KTable进行左连接,然后在值joiner中进行 如果正确的值为null,请执行Web服务查找,返回结果并将结果发布到项目KTable主题。 但这会阻止我们两次查看'abc'吗?

对于比例尺,我们当前的数据集有大约150万个单独的项目。

1 个答案:

答案 0 :(得分:1)

基本想法似乎是合理的,但我不会使用KTable,而是使用维持状态的自定义有状态Transformer()transform()只有一个输入流,您可以查找Transformer的状态。如果查找失败,则转到RCP,将其放入存储区,并为输出记录执行连接。