当响应时间超过 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 消息大小超过固定的最大消息大小

性能测试二八原则,响应时间2/5/8原则

当有效载荷长度大小大于 1000K 时,无法获得有效载荷响应。(Coap)

Azure 中托管的 ASP.Net Web API 高响应时间

如何使用ASP.NET MVC增加对AJAX JSON响应的2MB限制

nginx 代理在响应时间过长时导致错误