4

嗨,我最近在服务器上部署了 ktor 服务器项目作为我的应用程序使用的 rest 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")

目前我有大约 7k 用户,最大并发用户为 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 应该有一些到期时间? 在此处输入图像描述

4

0 回答 0