在 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 读取数据。
我在服务器端有一大堆对象(可能有 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 读取数据。