我们在使用Spring Boot 2.0、Webflux 5.0.7和Netty 4.1.25时遇到了网络传输问题。我们想将100000个序列化为JSON的项目(大约10Mb的网络流量)传输到一个客户端。
NIO和传统IO的网络传输性能有显著差异。测试结果如下:
Start reading 100000 from server in 5 iterations
Avg HTTP 283 ms
Avg stream 8130 ms
目前每秒的请求数量不是问题,但网络传输速度是问题。我们已经了解到,就网络速度而言,NIO可能会慢30%左右,但1/30倍是多余的。
在对客户端和服务器端进行采样时,我们发现原因主要是服务器端实现。从下面的屏幕截图可以看出,服务器花费在方法select()
和doWrite()
上的时间最多。
endpoint代码本身:
@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);
}
}
我们对Netty使用Spring Boot配置,我们怀疑默认情况下Netty配置错误。我们正在寻求你的帮助。我会根据你的要求添加任何其他细节。
Upd:目标是批量读取整个响应,以避免将所有响应放入内存,因为预期的数据量很大(几Gb)。在客户端消耗一批数据而不是一个元素是可以接受的。
您实际上并没有测试蔚来与IO。SpringWebFlux应用程序始终在服务器级别使用非阻塞IO(使用Netty,Undertow或任何符合Servlet 3.1异步IO的服务器)。
在这种情况下,您要比较:
在第一种情况下,SpringWebFlux以一种被动的方式生成响应主体,但将缓冲和刷新决策留给服务器本身。向网络写入是有成本的,缓冲一个但写入更大的块是有效的。
在第二种情况下,你要求SpringWebFlux为通量
的每个元素编写和刷新。当客户端正在侦听(可能是无限的)事件流并且两个不同的事件之间可能有一些时间时,这很有用。这种方法消耗了更多的资源,并解释了性能差异。
因此,这个基准测试并没有显示IO与NIO,而是流媒体与非流媒体。
如果您想对响应写入/刷新进行细粒度控制,可以降到ServerHttpResponse
级别,并使用writeAndFlushWith(Flux
另一种方法是创建包含< code>TestItem
列表的中间JSON对象,比如:
public Flux<TestItemBatch> batch() {
Flux<TestItem> items= //...;
Flux<List<TestItem>> itemsLists = items.buffer(100);
return itemsLists.map(list -> new TestItemBatch(list));
}
我正在进行从ActiveMQ“Classic”5.15.4到ActiveMQ Artemis 2.17.0的迁移,发现性能下降。我和一个制作人就一个主题进行了测试,并有不同数量的消费者使用该主题。我在测量信息创建和消费者接收之间的时间。 测试在一个由3个节点组成的集群上进行,所有节点都相互连接。每个代理都嵌入到一个JBoss中。我使用了一个由3个节点组成的集群,因为这是我们当前的生产设置。我挑战这
“ExtensionAttribute1”用于员工ID。(邮件和员工id项用于筛选所需数据。) 要在active directory中正确地组织数据将需要一些时间,但我希望立即解决这个问题,如只在用户登录尝试时导入等。
这一讲,我们将展示WinPcap的另一个高级特性:收集并统计网络流量。统计引擎利用了内核级的数据包过滤器,来有效地为收集到的数据包进行分类。如果你想阅读更多细节,请参阅 NPF驱动核心手册。 为了使用这个特性,编程人员必须打开一个适配器,并且,可以使用 pcap_setmode() 将它设置为统计模式(statistical mode)。特别注意,必须使用MODE_STAT来作为这个函数的mode
随着技术的发展,企业的正常运行越来越依赖基于线上网络的应用,所以IT部门需要持续监控和改善网络性能,保持用户始终不受网络性能影响,并快速,平稳地交付关键业务解决方案。
我目前正在使用自定义JWT身份验证进行SpringCloudGateway。身份验证后,我希望使用GlobalFilter将标头中的JWT令牌字符串传递到下游服务: JWT令牌字符串可以通过调用主体来获得。getName(); 我的问题是:我如何实现
问题内容: 我试图找出如果将主键更改为BIGINT(20)时表的性能是否会下降。目前,我正在使用INT(7),并且已经有大约 300.000个条目具有大ID(7或8位数字) 。我已经搜索了很多东西,但只发现它使用了更多的磁盘空间(这很明显)。 我所有的ID现在都有7位数字,但是我的客户希望更改为8位数字。将来我将无法轻松更改软件,因此我考虑现在使用BIGINT(20)以防万一。即使我不需要使用BI