akka流中的异步调用

时间:2017-02-07 08:29:28

标签: scala akka akka-stream

我想用这样的逻辑实现Diff转换流:

我有一些Source[JsValue]和一些带有id-> JsValue数据的数据库。我希望从JsValue和db中的Source获取Diff,然后进一步拉取生成的Diff并将JsValue从源存储到db。

我认为Akka-persistence是存储实现,但我只需要当前状态,因此它可以是任何键值db。

由于我是akka-stream的新手,我无法理解,实现这个想法的最佳方式是什么。

1 个答案:

答案 0 :(得分:1)

假设您的JsValue个对象有一个“id”字段,您可以编写一个查询Flow,它将接收原始JsValue并生成原始和数据库版本的元组:

def dbQuery(id : String) : JsValue = ???

val queryFlow : Flow[JsValue, (JsValue,JsValue), _] = 
  Flow[JsValue] map { originalJs =>
    originalJs -> dbQuery((originalJs \ "id").as[String])
  }

这些元组可以传递给差异Flow

def diffJs(original : JsValue, dbVersion : JsValue) : JsValue = ???

val diffFlow : Flow[(JsValue, JsValue), JsValue, _] = 
  Flow[(JsValue, JsValue)] map diffJs.tupled

你提到的最后一部分是一个能够保持差异的数据库,this can representedSink

val dbSink : Sink[JsValue, _] = ???

然后可以根据您的值来组合所有这些组件以形成流:

val jsSource : Source[JsValue, _] = ???

jsSource via queryFlow via diffFlow runWith dbSink

有关异步数据库查询的示例,请参阅this example演示mapAsync