背景:
某互联网医疗平台在疫情期间上线在线问诊功能,用户量激增至百万级。当用户发起实时问诊时,出现医生同时接诊超限(如1个医生同时服务5个患者)、患者等待超时、问诊消息延迟堆积等问题。系统采用Spring Cloud微服务架构,核心模块包括用户服务、医生服务、问诊服务、WebSocket实时通信。
技术栈:
- 核心语言:Java 17
- Web框架:Spring Boot + Spring WebFlux
- 消息队列:RabbitMQ
- 缓存技术:Redis + Redisson
- 微服务:Spring Cloud Gateway + Nacos
- 实时通信:WebSocket + Netty
- 监控:SkyWalking + Zipkin
- 限流组件:Sentinel
问题现象:
- 医生并发超限:同一医生被分配给多个用户,导致问诊资源争抢。
- 消息延迟:问诊消息队列堆积,部分消息延迟达5秒以上。
- 网关雪崩:WebSocket连接数暴增导致网关节点CPU占用率100%。
排查过程:
- 链路追踪:通过SkyWalking定位到
allocateDoctor()接口耗时异常(平均响应时间800ms)。 - 日志分析:发现Redis缓存的医生状态未及时更新,导致重复分配。
- 压测复现:使用JMeter模拟1000并发WebSocket连接,发现Netty线程池阻塞。
解决方案:
- Redis原子锁控制医生状态:
// 使用Redisson的RLock保证医生状态更新原子性 RLock lock = redisson.getLock("doctor_lock:" + doctorId); if (lock.tryLock()) { try { Integer currentPatients = (Integer) redisTemplate.opsForValue().


481

被折叠的 条评论
为什么被折叠?



