我有一个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秒才能将响应返回给客户端。
关于我应该如何改进的建议?这是预期的行为吗?我的目标是尽可能多地表现。
感谢您的帮助。