Серверное приложение 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 должен быть срок действия?