使用Spring Boot和StreamingResponseBody进行流式分块响应

时间:2020-06-14 20:44:50

标签: performance spring-boot api stream

我有一个Spring boot应用程序,我需要在其中将大JSON(30 MB)返回给客户端。我使用StreamingResponseBody直接写到响应OutputStream。

这是我的代码:

@PostMapping(value = "/search", produces = {"application/json"})
    public ResponseEntity<StreamingResponseBody> getEntitiesWithRelation(@RequestBody Search search) {
        String searchResult = entityService.search(search);
        return new ResponseEntity<>(getStreamingResponseBody(searchResult), HttpStatus.OK);
    }

private StreamingResponseBody getStreamingResponseBody(String searchResult) {
    List<String> strings = splitEquallyBySize(searchResult, 16384);
    return outputStream -> {
        for (int i = 0; i < strings.size(); i++) {
            outputStream.write((strings.get(i)).getBytes());
            outputStream.flush();
        }
    };
}

private List<String> splitEquallyBySize(String response, int size) {
    List<String> ret = new ArrayList<String>((response.length() + size - 1) / size);

    for (int start = 0; start < response.length(); start += size) {
        ret.add(response.substring(start, Math.min(response.length(), start + size)));
    }
    return ret;
}

由于我没有同时调用API,因此代码可以很好地用作日志,并在2-4秒内返回响应。但是一旦我开始同时调用API,比如说2 TPS(每秒事务),大约需要20-30秒才能将响应返回给客户端。

关于我应该如何改进的建议?这是预期的行为吗?我的目标是尽可能多地表现。

感谢您的帮助。

0 个答案:

没有答案