KTor завершает запросы GET, когда ответы занимают больше времени, чем requestReadTimeoutSeconds - PullRequest
0 голосов
/ 17 июня 2020

У нас есть несколько длинных запросов (получение слишком большого количества данных, но длинная история), которые завершаются KTor (движком Netty) на основании значения requestReadTimeoutSeconds. Это запросы GET, поэтому тело не отправляется.

Было установлено значение 25, и запрос завершается через 25 секунд, я изменил его на 15 секунд, после чего он начал завершаться через 15 секунд.

Даже несмотря на большой размер ответа, мы следим за тем, чтобы начать потоковую передачу результатов «немедленно». Я также вижу по клиенту, что мы начинаем получать контент, но соединение прерывается.

Я ошибаюсь, предполагая, что requestReadTimeoutSeconds не должен влиять на запросы GET. Не должен ли тайм-аут после получения тела по другим запросам? Или, может быть, нет способа определить, когда клиент "закончил" прием?

Спасибо, Андерс

1 Ответ

1 голос
/ 19 июня 2020

requestReadTimeoutSeconds отображается непосредственно на ReadTimeoutHandler (https://netty.io/4.0/api/io/netty/handler/timeout/ReadTimeoutHandler.html) из Netty: так что это способ настройки 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.

...