导语:
JDK21 的虚拟线程与 ZGC 为低延迟服务提供了新工具,但真正稳定要靠“线程模型+GC+依赖舱壁+观测与回滚”组合拳。本文给出实操方案与核查清单。
1. 线程模型
- 适用:大量阻塞 IO 或短任务优先虚拟线程;长计算/锁冲突使用平台线程。
- 规范:禁止在虚拟线程中持有重锁;I/O 驱动与连接池选择 Loom 兼容实现。
- 观测:线程数、调度延迟、阻塞堆栈;异常时回退到平台线程。
2. GC 策略
- ZGC 首选(JDK17+),参数示例:
-XX:+UseZGC -XX:+ZGenerational -XX:ConcGCThreads=4 -XX:ZCollectionInterval=1。 - 看板:GC 暂停/并发时间、晋升失败、堆占用;超阈值告警。
- 压测对比:记录 ZGC vs G1 的 P99、CPU,占 Runbook。
3. IO 与协议
- Netty:EPOLL/KQueue,
write_buffer_water_mark控制背压;大文件用FileRegion/sendfile。 - HTTP/2:流量控制与头压缩白名单;大响应分块/流式。
- 序列化:优先零拷贝解码、减少对象分配。
4. 依赖舱壁与超时
- 舱壁:每个依赖独立线程池/超时/断路器;熔断可降级到缓存或静态响应。
- 重试:带抖动,禁止级联重试;记录重试原因与次数。
- 兜底:高风险接口预置缓存/静态模板,熔断时直接返回。
5. 队列与背压
- 线程池分级(计算/IO/阻塞);队列长度基于压测设置。
- 消费端自适应拉取,超过延迟阈值自动降级为小批量。
- 返回排队位置或延迟提示,避免重试风暴。
6. 缓存与数据路径
- 热点缓存:本地/分布式缓存 + 版本号;防穿透/击穿;写路径幂等。
- 读写隔离:写走主库,读走只读副本/搜索;读失败回退主库要有限流。
- CDC:Binlog/CDC 更新缓存与搜索,监控复制延迟。
7. 容量与压测
- 模型:QPS、P99、CPU/内存、依赖时延;按增长率预估 buffer。
- 压测:核心路由验证背压/限流/降级效果;记录容量基线。
- 成本:高成本接口设配额,监控调用与预算。
8. 部署与回滚
- 灰度:1%-10%-50%-全量,覆盖高峰;观察 P99/错误率/GC/线程池水位。
- 回滚:镜像+配置双通道;回滚后 30 分钟验证指标。
- 证据包:参数、压测、容量、限流/熔断配置、回滚记录。
9. 快速核查
- 虚拟线程适用性评估与开关就绪;ZGC 参数与监控上线。
- 线程池/队列/限流/断路器配置明确,压测基线完成。
- 灰度/回滚脚本可用,证据包沉淀。
10. 操作示例
- 虚拟线程灰度:为阻塞型接口开启虚拟线程,观察线程数与 P99;异常快速关闭开关。
- GC 对比:压测同一场景下 ZGC 与 G1,记录暂停/CPU/P99,选型入 Runbook。
- 回滚演练:
rollback.sh version一键切换,30 分钟内抓取 P99/GC/线程池/队列水位快照。
结语:
用“虚拟线程 + ZGC + 舱壁/背压 + 观测”形成固定套路,低延迟 Java 服务才能在高峰期保持稳定与可回滚。