我需要每小时执行数十万个包含 Form 元素或 File 元素的多部分请求。每个请求有 2 个部分,请求的总大小约为 30kb,但最大可达 20meg。我正在测试不超过 30kb 的请求。我的帖子方法如下:
varpartData:PartData = getThePartData()
client.post("endpoint") {
headers(myHeaders)
setBody(MultiPartFormDataContent(partData,boundary,contentType))
}
在我的接收端点上
post("endpointThat Performs BAD!!!!") {
call.recieveMultipart().readAll().forEach {
// do somthing trivial
}
}
或者这是按预期执行的端点:
post("endpointThat Performs BAD!!!!") {
call.recieve<String>.also{
// do somthing trivial
}
}
现在,在第一个示例中,我收到了大约 400 毫秒的延迟。 在第二个示例中,我几乎没有收到任何延迟。
在尝试调整我使用 call.recieveMultipart() 的情况时,我也坐了该属性
io.ktor.http.content.multipart.skipTempFile to true
效果微乎其微
我尝试过两个客户端CIO和OkHttp,没有区别。
为什么 recieveMultipart 这么慢?我该如何解决它?
只需提供一些数字即可获取图片。使用 receiveMultipart 272 请求时需要 120 000 毫秒,receeve 需要 30 000 毫秒。大约相差4倍。
更新: 之间存在显着的性能差异
call.recieveMultipart().readAll()
和
call.recieveMultipart().forEachPart() {}
您的问题可能与 Ktor 中已知的
PartData.FileItem
性能下降有关,如本期所述:KTOR-7484。您可能需要检查这是否符合您的情况,特别是如果您正在处理较大的多部分表单或文件上传。它可以提供一些见解或潜在的解决方法。
希望这有帮助!