当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求
Posted
技术标签:
【中文标题】当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求【英文标题】:KTor is terminating GET requests when responses take longer than requestReadTimeoutSeconds 【发布时间】:2020-10-07 00:11:25 【问题描述】:我们有一些长请求(获取太多数据,但说来话长)被 KTor(Netty 引擎)根据 requestReadTimeoutSeconds
的值终止。这些是 GET 请求,因此没有要发送的正文。
设置为 25,请求在 25 秒后终止,我将其更改为 15 秒,然后在 15 秒后开始终止。
即使响应很大,我们也会确保“立即”开始回传结果。我也可以从客户端看到我们开始接收内容,但是连接被终止了。
假设requestReadTimeoutSeconds
不应该影响 GET 请求,我错了。它不应该在收到其他请求的正文后超时吗?或者可能无法确定客户端何时“完成”接收?
谢谢, 安德斯
【问题讨论】:
【参考方案1】:requestReadTimeoutSeconds
直接映射到来自 Netty 的 ReadTimeoutHandler
(https://netty.io/4.0/api/io/netty/handler/timeout/ReadTimeoutHandler.html):所以这是配置 Netty
内部的方式。
netty 官方文档说:
Raises a ReadTimeoutException when no data was read within a certain period of time.
超时是指网络读取,因此是预期行为。
您可以在这里做的事情是编写一个自定义功能: 例如:
class Timeouts
class Config(var postRequestTimeout: Long = 5000L)
companion object : ApplicationFeature<ApplicationCallPipeline, Config, Unit>
override val key: AttributeKey<Unit> = AttributeKey("Timeouts")
override fun install(pipeline: ApplicationCallPipeline, configure: Config.() -> Unit)
val postTimeout = Config().apply(configure).postRequestTimeout
if (postTimeout <= 0) return
pipeline.intercept(ApplicationCallPipeline.Features)
if (call.request.httpMethod != HttpMethod.Post) return@intercept
withTimeout(postTimeout)
proceed()
这里是要点:https://gist.github.com/e5l/31bcf22a813008bd7418b5c944b225c9
并安装它:
install(Timeouts)
postRequestTimeout = 5000 // in ms
此功能允许您直接设置发布请求的超时时间。
如果您在功能请求中描述您在此处的用例,我们将很高兴:https://github.com/ktorio/ktor/issues。
【讨论】:
酷。非常感谢您的详细解释。但是,这会对整个事务施加超时,而不仅仅是客户端发送内容。知道怎么做吗? :)以上是关于当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章
超出存储分配。服务器响应是:4.3.1 消息大小超过固定的最大消息大小
当有效载荷长度大小大于 1000K 时,无法获得有效载荷响应。(Coap)
Azure 中托管的 ASP.Net Web API 高响应时间