嗨,我最近在服务器上部署了 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())
}
}
}
}