akka http 抛出 EntityStreamException:实体流截断
Posted
技术标签:
【中文标题】akka http 抛出 EntityStreamException:实体流截断【英文标题】:akka http throws EntityStreamException: Entity stream truncation 【发布时间】:2016-07-13 00:45:15 【问题描述】:我正在使用 akka http 库为 rest API 编写客户端。该库似乎非常强大,但它对我来说非常不稳定。当我尝试使用 HttpResponse.entity 时,它经常(并非总是)抛出以下异常:
EntityStreamException:实体流截断
在此之后它完全停止处理后续请求。也许它试图处理一些背压或演员死了,我不知道。
使用请求级客户端 API 如何发送请求并不重要:
def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] =
val request = HttpRequest(GET, s"http://***/Search/$searchId")
for
response <- Http().singleRequest(request)
entity <- Unmarshal(response.entity).to[String]
result = entity.decodeEither[SearchResult]
yield result
或使用连接级客户端 API:
val client = Http(actorSystem).outgoingConnection("***")
def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] =
val request = HttpRequest(GET, s"Search/$searchId")
for
response <- Source.single(request).via(client).runWith(Sink.head)
entity <- Unmarshal(response.entity).to[String]
result = entity.decodeEither[SearchResult]
yield result
不管我是使用 unmarshaller 还是手动使用 getDataBytes 来消费实体,结果都是一样的——上面的异常。
响应的 http 状态是 200 OK,headers 是 ok,它是一个“默认”实体(所以,没有分块),内容长度约为 500-2000 Kb(增加 akka.http.parsing.max-content -length 没有帮助,尽管默认值应该足够了)。服务器也可以 - 其他平台上的其他 http 库也可以使用此 API。
这是一个错误还是我做错了什么? scala 最好的非阻塞、异步 http 库是什么?
【问题讨论】:
scala 最好的非阻塞、异步 http 库是什么? 哦,男孩,如果你知道了,请告诉我。我们刚刚开始使用 akka http,我看到了与您所看到的确切行为相同的错误。最大内容长度没有帮助。我想我已经把它缩小到内容大小的想法,因为一旦我发送了一定数量的数据,这就会开始发生。对于较小的请求,一切都按预期工作。 更新:我能够验证它与我发送的数据无关。我没有发送 1 个大批量请求,而是将其拆分为许多小请求(使用完全相同的 API)并成功通过。这肯定会让它看起来像存在固有的分块数据限制或导致更大请求的流问题。 再次更新:我能够解决我的问题。这是一个路由路径问题(是的,很严重)。我有一个嵌套路由,它与同一级别的另一条路由发生冲突。一旦我重新设计了路线的结构,一切正常。 @haggy 你是如何将请求分成更小的批次的? 【参考方案1】:我在最初的问题上有 cmets,但也在这里回答,因此可以投票以防万一这对任何人都有帮助。
这是一个路由路径问题(是的,很严重)。我有一个嵌套路由,它以某种方式与同一级别的另一条路由发生冲突(基本上有一个奇怪的原因导致一条路由覆盖另一条......)。一旦我重新设计了路线的结构,一切正常。
【讨论】:
奇怪的冲突是什么意思?我没有看到我的路线有什么奇怪的地方,但我仍然经常遇到同样的错误(尽管不是针对所有请求)。【参考方案2】:akka.http.parsing.max-to-strict-bytes
属性需要在配置文件中适当设置。也可以设置为infinite
。
【讨论】:
以上是关于akka http 抛出 EntityStreamException:实体流截断的主要内容,如果未能解决你的问题,请参考以下文章
使用 Akka / Akka Streams / Akka HTTP 时 Akka 版本冲突
akka-http 错误:找不到参数 um 的隐式值:akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller