我开始对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”示例会在只有少量并发请求的情况下使服务器崩溃。
提前感谢您的考虑和回应。