Серверное приложение Ktor продолжает увеличивать количество открытых соединений

Привет, я недавно развернул проект сервера ktor на сервере в качестве backend api для моего приложения, используя. Я использую netty и запускаю его на сервере с системной службой. Сервер Ktor работает на порту 7171, и всякий раз, когда я проверяю соединения с портом 7171, он продолжает увеличиваться. Я проверяю с помощью этой команды

ss -ant | grep :7171 | wc -l

После одного дня подключения 20k+ и отказа сервера ничего не работает.

Я думаю, что некоторые связи остаются открытыми. В журналах я не получаю никаких ошибок, кроме нескольких ошибок, таких какconnection reset by peer.

Я также использую HttpClient с Apache, а для кеширования списка данных я храню данные в объекте-компаньоне, поэтому не извлекаю их каждый раз из базы данных.

Я просмотрел код и сомневаюсь только в двух вышеупомянутых вещах.

Это мои зависимости от Gradle

implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version")
implementation("io.ktor:ktor-server-netty:$ktor_version")
implementation("io.ktor:ktor-client-apache:$ktor_version")
implementation("io.ktor:ktor-client-logging-native:$ktor_version")
implementation("io.ktor:ktor-gson:$ktor_version")
implementation("ch.qos.logback:logback-classic:$logback_version")
implementation("io.ktor:ktor-metrics:$ktor_version")
implementation("io.ktor:ktor-server-core:$ktor_version")
implementation("io.ktor:ktor-server-sessions:$ktor_version")
implementation("io.ktor:ktor-auth-jwt:$ktor_version")
implementation("org.jooq:jooq")
jooqGeneratorRuntime("mysql:mysql-connector-java:8.0.19")
implementation("mysql:mysql-connector-java:8.0.19")
implementation(group = "com.zaxxer", name = "HikariCP", version = "3.4.2")
implementation("io.sentry:sentry:1.7.30")
implementation("software.amazon.awssdk:s3:2.8.7")

В настоящее время у меня около 7 тысяч пользователей, а максимальное количество одновременных пользователей - 450. Пожалуйста, расскажите мне, как я могу проверить проблему и решить проблему.

Вот код HttClient:

suspend fun post(
        url: String,
        params: Map<String, String> = emptyMap(),
        headersMap: Map<String, String> = emptyMap()
    ): Result<String> {
        val httpClient = getHttpClient()
        return kotlin.runCatching {
            httpClient.post<String>(url) {
                body = MultiPartFormDataContent(
                    formData {
                        params.forEach {
                            append(it.key, it.value)
                        }
                    }
                )
                if (headersMap.isNotEmpty()) {
                    headersMap.forEach { (key, value) ->
                        header(key, value)
                    }
                }
            }.also {
                httpClient.close()
            }
        }.onFailure { httpClient.close() }
    }

    private fun getHttpClient(): HttpClient {
        return HttpClient(Apache) {
            install(HttpTimeout) {
                requestTimeoutMillis = 60000
            }
            engine {
                customizeClient {
                    sslContext = SSLContextBuilder.create().loadTrustMaterial(object : TrustStrategy {
                        override fun isTrusted(chain: Array<out X509Certificate>?, authType: String?): Boolean {
                            return true
                        }

                    }).build()
                    setSSLHostnameVerifier(NoopHostnameVerifier())
                }
            }
        }
    }

Также, пожалуйста, проверьте мой заголовок ответа api, я думаю, у keepalive должен быть срок действия?

0 ответов

Другие вопросы по тегам