我们在使用Spring Boot 2.0、Webflux 5.0.7和Netty 4.1.25时,在网络传输方面遇到了问题。我们想要将100000个以JSON格式序列化的项目(大约10MB的网络流量)传输给1个客户端。
NIO与传统IO之间的网络传输性能差异非常显著。测试结果如下:
我们正在使用Spring Boot配置Netty,但我们怀疑Netty默认配置不正确。我们需要您的帮助。如果需要,我可以提供其他详细信息。
更新: 目标是批量读取整个响应,以避免将所有响应放入内存中,因为预期的数据量非常大(几个GB)。在客户端上消耗一批数据而不是一个元素是可以接受的。
NIO与传统IO之间的网络传输性能差异非常显著。测试结果如下:
Start reading 100000 from server in 5 iterations
Avg HTTP 283 ms
Avg stream 8130 ms
目前每秒请求的数量不是问题,但网络传输速度是。我们已经了解到,在网络速度方面,NIO可能会慢约30%,但1 / 30x太过于严重。
在客户端和服务器端采样时,我们观察到原因主要在服务器端实现上。从下面的截图可以看出,服务器大部分时间都花在select()
和doWrite()
方法中。
端点代码本身:
@RestController
@RequestMapping(produces = {APPLICATION_JSON_VALUE, APPLICATION_STREAM_JSON_VALUE})
@Validated
public class StreamingController {
@GetMapping("/instruments/{eodDate}")
public Flux<TestItem> getInstruments(
@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate eodDate,
@RequestParam(required = false) Instant asOfTimestamp) {
//Generate test data in memory
List<TestItem> collect = IntStream.range(0, 100000)
.mapToObj(i -> new TestItem.Builder().build())
.collect(Collectors.toList());
return Flux.fromIterable(collect);
}
}
我们正在使用Spring Boot配置Netty,但我们怀疑Netty默认配置不正确。我们需要您的帮助。如果需要,我可以提供其他详细信息。
更新: 目标是批量读取整个响应,以避免将所有响应放入内存中,因为预期的数据量非常大(几个GB)。在客户端上消耗一批数据而不是一个元素是可以接受的。
Stream
吗?还是文件 I/O?或者是原始套接字 I/O? - Stephen CFlux
转换为Collection
进行HTTP调用。因此,我基本上正在比较网络速度。 - schaffe