在 Akka Http 中发送大量对象列表

Send large List of Objects in Akka Http

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

但问题是它会影响客户端和服务器的内存性能,因为列表非常大。

那么除了将对象的整个列表转换为字节之外,还有什么最好的方法可以实现这一目标吗?

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

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

解释了如何使用流方法从数据库中获取行。最终结果是您有一个行源:

type DataObject = ???

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

2。将数据对象转换为字节

只有了解您的数据的具体情况才能回答这部分,听起来您已经实现了这部分:

val converter : DataObject => ByteString

3。附加到 REST 端点

您可以使用 akka-http 设置客户端可以查询以获取数据的 REST 端点。您的 ByteString 值的 Source 将成为为您的 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 读取数据。