Willson Chen

Stay Hungry, Stay Foolish.

高并发基础

高并发基础

高并发的目标

高性能

  • 高性能:高吞吐量和低响应。
  • 吞吐量:单位时间内处理的请求数。
    • QPS:每秒查询数。
    • TPS:每秒事务数。
  • 响应时间:请求到响应的总耗时。
    • 平均响应时间:总响应时间/总请求数,无法体现慢请求。
    • TP90响应时间:满足90%的请求的最低响应时间。
    • TP99响应时间:满足99%的请求的最低响应时间。
  • 响应时间与用户感受:200毫秒感觉无延迟,1秒可接受,3秒就会感受到慢。
  • 健康系统:TP99在200毫秒内,TP999在1秒内。

高可用

  • 高可用:无故障运行能力。
  • 可用性:正常运行时间/总运行时间
  • 可用性指标:
    • 1个9(90%),年故障时间 36.5 天
    • 2个9(99%),年故障时间 3.65 天
    • 3个9(99.9%),年故障时间 8小时
    • 4个9(99.99%),年故障时间 52分钟
    • 5个9(99.999%),年故障时间 5分钟

高扩展

  • 高扩展:能短时间扩容应对流量高峰。
  • 扩展性:性能提升比例/机器增加比例
  • 高可扩展:扩展性维持在70%以上。

通用设计方法

纵向扩展

  • 提升单机硬件:增加内存、CPU核数、存储容量、磁盘升级 NAS。
  • 提升单机软件:使用缓存减少 IO、使用并发或异步增加吞吐。

横向扩展

  • 前提:依赖于分层架构,允许独立对某一层扩展。
  • 常见分层架构:
    • 动静分离:通过CDN加速静态内容交付,降低源服务器负载。
    • 反向代理层:七层nginx或四层lvs作反向代理,实现负载均衡和SSL终止。
    • Web层:统一的API网关,实现安全、限流等。
    • 业务服务层:按垂直业务领域化分微服务。
    • 存储层:采用异构数据库,满足不同的性能和一致性要求。
  • 各层水平扩容:
    • 无状态水平扩容:对于Web服务和业务服务,通过增加实例扩容。
    • 有状态水平扩容:如数据库和缓存等有状态服务,通过分区或分片、主从同步和读写分离进行扩容。
    • 集群设计:将无状态或有状态的集群,都设计为易于水平扩容。

实践方案

高性能实践

  • 集群部署:通过负载均衡减轻单机压力。
  • 多级缓存:包括CDN、本地缓存、分布式缓存,需处理缓存穿透、数据一致性等问题。
  • 分库分表和索引优化:通过分库分表/索引优化提高数据库的查询效率,使用搜索引擎解决复杂查询。
  • NoSQL数据库:如Redis、MongoDB等。
  • 异步化:通过多线程、消息队列、延时任务等实现异步化,提高吞吐。
  • 限流:对于允许限流的业务,通过前端限流、nginx限流、服务端限流等防止过载。
  • 削峰填谷:通过消息队列承接流量,平滑负载。
  • 并发处理:通过多线程将串行改并行,提高处理能力。
  • 预计算:对于可预计算场景如抢红包等,将提前计算缓存结果。
  • 缓存预热:通过异步任务将数据提前加载到本地或分布式缓存中。
  • 减少IO次数:通过数据库缓存、批量读写,RPC批量接口等方式。
  • 减少IO数据包大小:通过轻量级通信协议、去冗余字段、减少缓存key大小,压缩value等方式。
  • 池化技术和池大小设置:通过http请求池、线程池、数据库和redis连接池等池化技术。根据CPU密集还是IO密集设置核心参数。
  • 锁选择:读多写少用乐观锁,分段锁减少冲突。
  • 配套监控系统:了解性能表现,分析瓶颈,根据二八原则抓主要矛盾,针对性优化。

高可用实践

  • 对等节点的故障转移:通过nginx和服务注册发现机制。
  • 非对等节点的故障转移:通过心跳检测和主备切换,如redis的哨兵模式和mysql的主从切换。
  • 接口层面的容错处理:通过超时重试、幂等,提高接口的容错能力。
  • 降级处理:负载过高时降级处理,保证核心服务可用性,牺牲非核心服务。必要时熔断防止雪崩。
  • 限流处理:限流防止过载,超出处理能力的请求拒绝。
  • 消息可靠性保证:通过生产端的重试机制、broker持久化、消费端的手动确认保证消息的可靠性。
  • 灰度发布:按机器维度小流量部署,观察日志和业务指标,平稳后再推全量。
  • 监控报警:CPU、内存、磁盘、网络、各类中间件的监控和业务指标监控。
  • 灾备演练:模拟局部故障,检验系统可用性和容灾能力。

高扩展实践

  • 合理分层架构:通过合理的分层架构,使每一层都可以独立地扩展,而不影响其他层。
  • 存储层拆分,按业务垂直拆分,按数据特征拆分。
  • 业务层拆分:按业务领域拆分,按重要程度拆分。