用于文件消费的 akka 流设计模式

问题描述

我遇到了一个问题,我被要求使用 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