WebFlux WebClient在分段上传期间将整个文件加载到直接缓冲存储器中

时间:2019-08-07 12:49:15

标签: spring-boot spring-webflux spring-webclient

我正在使用Spring Boot 2.1.6.RELEASE和Webflux构建应用程序

我们有一个端点,可以使用多部分上传文件,并且使用WebClient进行上传。

我们的上传客户端代码如下

@Component
class UploadClient(
    private val client: WebClient,
) {
    suspend fun upload(filePath: String) =
        client.post()
              .uri("/upload")
              .contentType(MULTIPART_FORM_DATA)   
              .body(BodyInserters.fromMultipartData(generateMultipartBody(filePath)))
              .retrieve()
              .bodyToMono(UploadResult::class.java)
              .awaitFirst()

    private fun generateMultipartBody(filePath: String): MultiValueMap<String, HttpEntity<*>> {
        val builder = MultipartBodyBuilder()
        builder.part("file", FileSystemResource(filePath))
        return builder.build()
    }
}

但是,当我们上传一个大文件(1.6gb)时,我们看到整个文件都已加载到直接内存中

visualvm

文件上传后,内存将释放,然后在下一个文件上传时,您会再次看到内存峰值。

为了对比,我尝试用https://github.com/AsyncHttpClient/async-http-client替换WebClient,并且内存使用量要低得多,每次上传大约60mb

当WebFlux客户端适合我们所有其他用途时,我真的不想引入另一个http客户端依赖项。

1 个答案:

答案 0 :(得分:2)