1.虚拟线程镜像: guanyangsunlight/spring-project-samples:virtualthread-sample-0.0.1-SNAPSHOT
2.webflux镜像:guanyangsunlight/spring-project-samples:webflux-sample-0.0.1-SNAPSHOT
{
msg: "Hello World!",
time: 1695871679753,
thread: "VirtualThread[#59]/runnable@ForkJoinPool-1-worker-1"
}
-i:指定请求数量 -u:模拟并发数量 –duration:请求时长定义,例如:60s,1m -e url:指定环境变量url,用于实际场景替换
##### `simple-test.js`脚本说明
import http from ‘k6/http’; import { check } from ‘k6’;
export default function () {
const res = http.get(${__ENV.url}
);
check(res, {
‘is status 200’: (r) => r.status === 200
});
}
##### 压测docker实例
```shell
## 启用虚拟线程实例
docker run --name virtualthread-sample-vt -p 8081:8080 -e SPRING_EXECUTOR=virtual -d guanyangsunlight/spring-project-samples:virtualthread-sample-0.0.1-SNAPSHOT
## 启用webflux实例
docker run --name webflux-sample -p 8083:8080 -d guanyangsunlight/spring-project-samples:webflux-sample-0.0.1-SNAPSHOT
Case | QPS | Avg Latency | P95 |
---|---|---|---|
Spring Boot虚拟线程,-u 200 | 1620.869685/s | 123.09ms | 149.42ms |
Spring Boot虚拟线程,-u 400 | 2634.599143/s | 151.55ms | 198.37ms |
Spring Boot虚拟线程,-u 600 | 3136.075961/s | 186.44ms | 256.03ms |
Spring Boot虚拟线程,-u 800 | 3780.654388/s | 210.28ms | 294.79ms |
Spring Boot虚拟线程,-u 1000 | 4250.384928/s | 234.17ms | 319.92ms |
Spring Boot虚拟线程,-u 1200 | 4479.450088/s | 266.15ms | 370.17ms |
Spring webflux响应式,-u 200 | 1826.774964/s | 109.22ms | 127.25ms |
Spring webflux响应式,-u 400 | 3516.072783/s | 113.35ms | 138.09ms |
Spring webflux响应式,-u 600 | 4868.593872/s | 122.69ms | 160.59ms |
Spring webflux响应式,-u 800 | 5852.713635/s | 136.14ms | 182.87ms |
Spring webflux响应式,-u 1000 | 5994.725404/s | 166.09ms | 255.77ms |
Spring webflux响应式,-u 1200 | 6878.047424/s | 173.48ms | 278.69ms |
Spring WebFlux和JDK虚拟线程是两种不同的技术,用于解决不同的问题,并具有不同的使用场景。下面是它们之间的对比及使用场景:
1.需要处理大量并发请求和对响应时间有较高要求的场景。
2.需要利用异步处理提高系统的吞吐量和响应性能。
3.希望借助Spring Framework的丰富生态系统来简化开发。
1.需要处理大量任务和对资源利用率有较高要求的场景。
2.希望通过协程或轻量级线程实现更灵活、可控的并发编程。
3.需要快速启动和停止线程。
需要根据具体的需求和项目情况来选择适合的技术。在某些场景下,可能也可以将两者结合使用,以充分发挥各自的优势。