我在服务器端有一个很大的对象列表(可能有 1k-2k 存储在数据库中),需要根据客户端的请求使用 Akka Http 将其发送到多个客户端。简单的解决方案是我可以从服务器端的数据库检索它,创建对象列表的字节,然后将字节发送到客户端,然后将该字节转换为对象。
但问题是它会影响客户端和服务器的内存性能,因为列表非常大。
那么除了将对象的整个列表转换为字节之外,还有什么最好的方法可以实现这一点吗?
最佳答案
您的问题的答案涉及服务器端和客户端的几个步骤。注意:为了简洁起见,下面的所有代码示例都是用 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 端点。 ByteString
值的 Source
将是为您的 HttpResponse
设置响应特定路径上的 GET
请求的 Route
:
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 读取数据。
关于java - 在 Akka Http 中发送大量对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53538017/