使用vert.x流式处理Chunked HTTP实体

时间:2017-09-05 13:18:43

标签: java scala reactive-programming vert.x akka-http

我开始对vert.x进行初步审核,并将其与akka-http进行比较。 akka似乎闪耀的一个领域是响应体的流动。

在akka-http中,可以创建一个利用反压的流实体,允许客户决定何时准备使用数据。

例如,可以使用包含10亿个"42"值实例的实体创建响应:

//Iterator is "lazy", therefore this function returns immediately
val bodyData : () => Iterator[ChunkStreamPart] = () => 
  Iterator 
    .continually("42")
    .take(1000000000)
    .map(ChunkStreamPart.apply)

val route = 
  get {

    val entity : HttpEntity = 
      Chunked(ContentTypes.`text/plain(UTF-8)`, Source fromIterator bodyData)

    complete(HttpResponse(entity=entity))
  }

上面的代码不会“炸毁”服务器的内存,并会在生成十亿个值之前将响应返回给客户端。

当客户端尝试使用响应正文时,"42"值将即时创建。

问题:此流媒体功能是否也存在于vert.x?

HttpServerResponse类的粗略审核表明它不是因为write成员函数只能接受String或vert.x Buffer。根据我的有限理解,似乎缓冲区并不是懒惰并将数据保存在内存中,这意味着10亿“42”示例会在只有少量并发请求的情况下使服务器崩溃。

提前感谢您的考虑和回应。

0 个答案:

没有答案