面试宝典第三话 -- 如果系统QPS突然提升10倍该怎么处理?

在高并发系统重,QPS(Queries Per Second)是一个重要的性能指标。当系统QPS突然提升10倍时 ,如果没有合理的对应措施,系统可能会出现性能瓶颈甚至奔溃。本文将介绍在Java系统中如何应对这种情况。

1. 预防性措施

1.1 性能监控

首先,建立完善的性能监控体系,实时监控系统额度QPS、CPU、内存、磁盘IO等指标,及时发现和预警性能问题。

1.2 负载均衡

使用负载均衡中间件(如Nginx)将流量分布到多个节点上,防止某个节点成为瓶颈。

1.3 部署备用节点

流量突增假如伴随着事件,在事件发布之前做好备用节点,使用zk或者redis的心跳过期监听来启动备用节点,以防节点挂了一个之后导致其他节点成为瓶颈,也有可能会跟着挂掉。

2.突发流量处理

2.1 根据系统扩量

在突发流量到来时,可通过水平扩展快速提升系统容量:
自动扩展:使用容器编排工具(如k8s)配置自动扩展策略,根据流量自动增加或减少服务实例数量。
服务拆分:使用微服务价格,每个小服务独立扩展,便于节点批量新增。

2.2 缓存策略

合理使用缓存,能大幅度提升系统性能,减少数据库压力:
本地缓存:可以使用guava或caffeine等本地缓存库缓存热点数据。
分布式缓存:使用Redis缓存高频访问的数据。

2.3 限流与降级

限流:使用限流算法(如令牌桶、漏桶)限制每秒请求数,保护系统免受流量冲击。
降级:对非核心功能进行降级处理,确保核心功能的稳定性。

3.实现步骤

3.1 性能监控实现

使用Spring Boot Actuator监控系统性能,添加xml依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

yaml配置Actuator

management:
  endpoints:
    web:
      exposure:
        include: "*"
  metrics:
    export:
      prometheus:
        enabled: true

集成Prometheus和Grafana,实现实时监控和告警。

3.2 本地缓存实现

使用guava的Cache做本地缓存,引入依赖

<dependency>
    <groupId>com.google.guavagroupId>
    <artifactId>guavaartifactId>
    <version>32.1.2-jreversion>
dependency>

代码实现

static Cache<String, String> expireCached = CacheBuilder.newBuilder()
        .maximumSize(100)   //最大缓存数量
        .expireAfterAccess(120000, TimeUnit.MILLISECONDS)  //120S缓存过期
        .expireAfterWrite(120000, TimeUnit.MILLISECONDS)
        .build();

ConcurrentMap<String, String> map = expireCached.asMap();
String data = map.get(data_key);
//不存在才从新查询 并存入缓存
if(put == null){
	//查询db
	......
	//存入本地缓存
	map.put(data_key,data);
}

本地缓存需要每个节点为维护一套数据,缓存仅对当前节点生效。

3.3 分布式缓存策略实现

使用Redis实现分布式缓存,引入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>
  • yaml配置
spring:
  data:
    redis:
      database: 0
      host: 192.168.168.131
      port: 6379
      #连接超时时间
      timeout: 5000
      repositories:
        enabled: false
  • 代码缓存数据
@Service
public class CacheService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void cacheData(String key, Object value) {
        redisTemplate.opsForValue().set(key, value, 10, TimeUnit.MINUTES);
    }

    public Object getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

分布式节点的益处就是仅需一次缓存,其他节点都可用。

4 限流与降级实现

限流就不重复写了,之前的文章都有,贴个门吧

4.1 切面限流实现

面试宝典第二话 – 如何设计一个秒杀系统

4.2 Gateway 熔断 限流

SpringCloud第五话 – Gateway实现负载均衡、熔断、限流

5.总结

当系统QPS突然提升10倍时,通过性能监控、负载均衡、缓存策略、限流与降级等措施 ,可以有效的应对突发流量,保障系统的稳定性和高性能。本文介绍了这些措施的实现步骤,仅供大家参考。

以上就是本文的全部内容了,希望这篇文章对你 有所帮助!

上一篇:面试宝典第二话 – 如何设计一个秒杀系统
下一篇:面试宝典第四话 – 如何设计一个支持10万QPS的会员系统

与君歌一曲,请君为我倾耳听。

你可能感兴趣的:(随手记录,java开发,面试,java)