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

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

我在服务器端有一个很大的对象列表(可能有 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

提供流实体的 Source

设置响应特定路径上的 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/

相关文章:

scala - Akka 流 : What is the difference between Unzip and Broadcast?

无法通过将鼠标移开来取消 JavaFX MenuItem

java.lang.NoClassDefFoundError : com. amazonaws.services.s3.AmazonS3Client

java - 是否有比使用 if-else 语句(或 switch)更面向对象的方法来选择基于字符串的类?

scala - Akka Streams - 如何在图表中保留辅助接收器的物化值

scala - Akka HTTP 根据 Future 的结果设置响应头

java - 如何使用 Thymeleaf 在 Java Spring 中创建简单表单

scala - Akka 流——按流中元素的数量过滤

akka - 在 Akka Streams 中使用动态接收器目标

scala - 在构建FlowGraph时,如何连接两个Flow?