问题描述
我遇到了一个问题,我被要求使用 akka 流来设计一个搜索 API,以便在几个相关的 .tsv 文件中查找数据。
例如,您有 2 个文件:
movies.tsv (id,title)
actors.tsv (name,movieIds)
假设您想创建一个端点,列出在一部电影中扮演的所有演员,只需指定名称 def principalsForMovieName(name: String): Source[Actor,_]
您必须读取第一个文件以获取包含输入名称的所有电影 ID,然后处理第二个文件以列出相关演员。
我以为我可以通过将 2 个来源(首先是电影,然后是演员)连接在一起来实现这一点,但这似乎与 akka 反应流不同。
我猜我可能错过了整个流概念中的某些内容。你能指出我正确的方向吗?
解决方法
这是可行的,但如果多部电影碰巧共享一个标题则效率低下:
- 从
movies.tsv
读取一行行 - 过滤流以查找与电影名称和
map
与电影 ID 匹配的标题 - 对于每个电影 ID,从
actors.tsv
发出一个行流(flatMapConcat
可能是这里感兴趣的流运算符) - 过滤流以查找与该电影 ID 匹配的记录
-
map
每条记录到演员姓名
效率低下是由于反复重新阅读和扫描 actors.tsv
。