在Akka Http中发送大量对象

时间:2018-11-29 11:28:38

标签: java akka akka-stream akka-http akka-persistence

我在服务器端有大量对象(可能存储在db中的1k-2k),需要根据客户端的请求使用Akka Http发送给多个客户端。一种简单的解决方案是,我可以从服务器端的数据库中检索它,生成一个对象列表的字节,然后将字节发送给客户端,然后将该字节转换为对象。

但是问题在于它可能影响客户端和服务器上的内存性能,因为列表很大。

那么,除了将对象的整个列表转换为字节以外,还有什么最佳的方法吗?

1 个答案:

答案 0 :(得分:1)

问题的答案涉及服务器端和客户端的几个步骤。注意:以下所有代码示例都在scala中而不是java中,以简洁起见。在服务器端,您需要实现:

1。从数据库流式传输数据

another stack question/answer说明了如何使用流方法从数据库中获取行。最终结果是您有行的来源:

type DataObject = ???

val source : Source[DataObject,_] = ??? // see linked answer

2。将DataObject转换为字节

只有知道了数据的详细信息后才能回答此部分,听起来您已经实现了此部分:

val converter : DataObject => ByteString

3。附加到REST端点

您可以使用akka-http设置REST端点,客户端可以查询该REST端点以获取数据。您的Source值中的ByteString将成为您的HttpResponse

的流实体的源

设置一个Route来响应特定路径上的GET请求:

val route : Route = 
  get {
    path("/queryDB") {
      complete(HttpResponse(entity = HttpEntity(ContentTypes.`application/octet-stream`, source.map(converter))))
    }
  }

并使用“路线”启动服务:

Http().bindAndHandle(route, "localhost", 8080)

在客户端,有similar mechanisms可以从HttpResponse中读取数据。