我在服务器端有大量对象(可能存储在db中的1k-2k),需要根据客户端的请求使用Akka Http发送给多个客户端。一种简单的解决方案是,我可以从服务器端的数据库中检索它,生成一个对象列表的字节,然后将字节发送给客户端,然后将该字节转换为对象。
但是问题在于它可能影响客户端和服务器上的内存性能,因为列表很大。
那么,除了将对象的整个列表转换为字节以外,还有什么最佳的方法吗?
答案 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中读取数据。