
在做互联网医院系统时,很多团队一开始关注的是功能是否完整:AI问诊、智能分诊、医生接诊、电子处方、在线支付。但真正决定系统“能不能扛得住”的,是高并发场景下的性能设计。
尤其是AI问诊模块,一旦推广到多医院、多科室、多城市,用户同时在线发起问诊请求,系统就会面临:
如果架构设计不到位,系统不是卡顿,就是直接崩溃。

下面我们从架构层、服务层、数据层和AI调用层,系统讲清楚优化思路,并结合代码示例说明实现方式。
高并发场景下,第一步不是“优化代码”,而是做架构拆分。
推荐结构:
使用Spring Boot + Redis做令牌桶限流:
@Component
public class RateLimitInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate redisTemplate;
private static final int LIMIT = 100; // 每秒100次
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String key = "ai:rate:limit";
Long count = redisTemplate.opsForValue().increment(key);
if (count == 1) {
redisTemplate.expire(key, 1, TimeUnit.SECONDS);
}
if (count > LIMIT) {
response.setStatus(429);
response.getWriter().write("Too Many Requests");
return false;
}
return true;
}
}意义很明确: 宁可丢弃部分请求,也不能让系统整体雪崩。
大模型推理时间往往在1–5秒之间,如果直接同步调用,线程会被大量占用。
解决方案: 使用消息队列 + 异步回调。
@PostMapping("/ai/consult")
public String consult(@RequestBody ConsultRequest request) {
String taskId = UUID.randomUUID().toString();
request.setTaskId(taskId);
rabbitTemplate.convertAndSend("ai.exchange",
"ai.routing",
request);
return taskId;
}@RabbitListener(queues = "ai.queue")
public void handleConsult(ConsultRequest request) {
String result = aiService.callModel(request.getContent());
redisTemplate.opsForValue().set(
"ai:result:" + request.getTaskId(),
result,
10,
TimeUnit.MINUTES
);
}@GetMapping("/ai/result/{taskId}")
public String getResult(@PathVariable String taskId) {
return redisTemplate.opsForValue()
.get("ai:result:" + taskId);
}这样做的好处:
AI问诊的聊天记录、问诊记录数据量极大。
CREATE TABLE consult_record_0 LIKE consult_record;
CREATE TABLE consult_record_1 LIKE consult_record;
...
CREATE TABLE consult_record_15 LIKE consult_record;分表逻辑:
public String getTableName(Long userId) {
int index = (int)(userId % 16);
return "consult_record_" + index;
}CREATE INDEX idx_user_id ON consult_record(user_id);
CREATE INDEX idx_create_time ON consult_record(create_time);避免全表扫描,是高并发系统最基础的保障。

在互联网医院AI问诊中,有三类数据可以缓存:
public Doctor getDoctor(Long doctorId) {
String key = "doctor:" + doctorId;
String json = redisTemplate.opsForValue().get(key);
if (json != null) {
return JSON.parseObject(json, Doctor.class);
}
Doctor doctor = doctorMapper.selectById(doctorId);
redisTemplate.opsForValue().set(
key,
JSON.toJSONString(doctor),
30,
TimeUnit.MINUTES
);
return doctor;
}在高并发下,这种缓存机制可以减少70%以上数据库访问。
AI问诊如果使用默认线程池,很容易耗尽资源。
建议自定义线程池:
@Bean
public ExecutorService aiExecutor() {
return new ThreadPoolExecutor(
10,
50,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}关键点:
当问诊记录写入量大时,可以采用:
示意配置:
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://master-db:3306/hospital
slave:
url: jdbc:mysql://slave-db:3306/hospital这样能显著提升系统整体吞吐能力。
不要把AI推理和主业务部署在同一服务。
推荐:
示例部署配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-service
spec:
replicas: 3
template:
spec:
containers:
- name: ai
image: ai-model:latest
resources:
limits:
nvidia.com/gpu: 1这样可以做到:

在互联网医院AI问诊场景下,高并发优化的本质是:
不要试图用“优化几行代码”解决性能问题。 真正的高并发系统,拼的是架构设计能力。
如果你的系统未来要支撑:
那么高并发优化必须从一开始就纳入架构设计,而不是等崩溃之后再补救。
真正成熟的互联网医院AI问诊系统,一定是为峰值流量而设计的,而不是为日常流量而设计的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。