1000qps怎么保证系统的高可用

1000qps怎么保证系统的高可用(k8s)到消息隔离、限流、线程池怎么配置、缓存上面的优化

要保证系统在 1000 QPS 的高并发场景下实现高可用,需要从 Kubernetes 部署架构、消息隔离、限流、线程池优化、缓存策略 等多个维度进行设计。以下是完整的优化方案:

  1. Kubernetes 高可用架构设计
    (1) 多副本部署 + HPA 自动扩缩容

deployment.yaml 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3  # 初始副本数
  selector:
    matchLabels:
      app: my-app
  template:
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        resources:
          limits:
            cpu: "2"
            memory: "2Gi"
          requests:
            cpu: "1"
            memory: "1Gi"
---

HPA 自动扩缩容 (CPU > 70% 或 QPS > 800 时扩容)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: External
    external:
      metric:
        name: requests_per_second
        selector:
          matchLabels:
            app: my-app
      target:
        type: AverageValue
        averageValue: 800

(2) Pod 反亲和性 + 多可用区部署

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: [my-app]
      topologyKey: kubernetes.io/hostname
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values: [zone-a, zone-b, zone-c]

(3) 健康检查 + 就绪探针

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  1. 消息隔离(MQ 优化)
    (1) 消息队列选型
    ● 高吞吐场景:Kafka(分区并行消费)
    ● 延迟敏感:RabbitMQ(优先级队列)
    ● 顺序消息:RocketMQ(顺序消息)
    (2) Kafka 分区设计
    // Producer 配置
    props.put(“acks”, “1”); // 平衡吞吐与可靠性
    props.put(“retries”, 3);
    props.put(“batch.size”, 16384); // 批量发送提升吞吐

// Topic 分区数 = 消费者数量 × 2(例如 6 分区)
bin/kafka-topics.sh --create --topic orders
–partitions 6 --replication-factor 3
(3) 消费者隔离
● 独立消费者组:不同业务使用不同 group.id
● 慢消费隔离:将延迟敏感消息单独放入高优先级队列

  1. 限流策略
    (1) 网关层限流(Nginx/Spring Cloud Gateway)

Nginx 限流 (1000 QPS)

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=1000r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=200 nodelay;
        proxy_pass http://backend;
    }
}
(2) 分布式限流(Redis + Lua)
// Redis 令牌桶算法
String luaScript = "local key = KEYS[1] " +
                   "local limit = tonumber(ARGV[1]) " +
                   "local current = tonumber(redis.call('get', key) or 0) " +
                   "if current + 1 > limit then return 0 else redis.call('INCR', key) return 1 end";

// 调用限流
Boolean pass = redisTemplate.execute(
    new RedisCallback<Boolean>() {
        @Override
        public Boolean doInRedis(RedisConnection connection) {
            return connection.eval(
                luaScript.getBytes(),
                1,
                "api_limit_".getBytes(),
                "1000".getBytes()
            ) == 1;
        }
    }
);

(3) Sentinel 熔断降级

Spring Cloud Alibaba Sentinel 配置

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      web-context-unify: false
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: sentinel-rules
            ruleType: flow
  1. 线程池优化
    (1) Tomcat/Jetty 线程池配置

application.yml (Spring Boot)

server:
  tomcat:
    threads:
      max: 200       # 最大线程数 (公式: QPS × 平均响应时间(ms) / 1000)
      min-spare: 20  # 最小空闲线程
  jetty:
    threadPool:
      maxThreads: 200
      minThreads: 20
(2) 异步任务线程池
@Configuration
public class ThreadPoolConfig {
    @Bean("asyncTaskExecutor")
    public Executor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(50);      // 核心线程数
        executor.setMaxPoolSize(200);      // 最大线程数
        executor.setQueueCapacity(1000);   // 队列容量
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setThreadNamePrefix("async-task-");
        return executor;
    }
}
(3) 线程池监控
// 监控线程池状态
ThreadPoolExecutor executor = (ThreadPoolExecutor) asyncTaskExecutor;
log.info("ActiveThreads={}, QueueSize={}", 
    executor.getActiveCount(), 
    executor.getQueue().size());

5. 缓存优化
(1) 多级缓存架构
请求 → CDN → Nginx缓存 → Redis → 本地缓存(Caffeine) → DB
(2) Redis 优化
# Redis 集群配置 (6节点: 3主3从)
spring:
  redis:
    cluster:
      nodes: redis-1:6379,redis-2:6379,redis-3:6379
    lettuce:
      pool:
        max-active: 1000  # 连接池大小
        max-wait: 10ms

(3) 缓存策略
策略 适用场景 配置示例
读写穿透 强一致性场景 @Cacheable + Cache-Aside
异步刷新 高并发读场景 Caffeine.refreshAfterWrite(5m)
分布式锁防击穿 防止缓存失效风暴 RedissonLock.tryLock()

// Caffeine 本地缓存
LoadingCache<String, Data> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(5, TimeUnit.MINUTES)
    .refreshAfterWrite(1, TimeUnit.MINUTES)
    .build(key -> loadFromDB(key));
  1. 监控与告警
    (1) Prometheus + Grafana 监控

prometheus.yml 抓取配置

scrape_configs:
  - job_name: 'spring-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['app:8080']

(2) 关键指标告警
● QPS 突增:rate(http_requests_total[1m]) > 1200
● P99 延迟:histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[1m])) > 1s
● 缓存命中率:sum(rate(cache_hits_total[1m])) / sum(rate(cache_requests_total[1m])) < 0.9

总结:1000 QPS 高可用架构
层级 技术方案 优化目标
基础设施 K8s多副本+HPA+多可用区 弹性伸缩、容灾
流量控制 Nginx限流+Sentinel熔断 防止过载、优雅降级
消息队列 Kafka分区+消费者隔离 并行处理、业务解耦
线程池 动态线程池+异步化 资源利用率最大化
缓存 多级缓存+本地缓存刷新 降低延迟、减少DB压力
监控 Prometheus+Granfana+告警 快速定位瓶颈
通过以上组合策略,系统可以稳定支撑 1000 QPS 并具备横向扩展能力。实际部署时需根据压测结果微调参数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值