线上问题处理

事前

预案&规章制度

规划区分系统优先级(P)

区分主要系统和次要系统,明确系统目标

限流机制

限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。
常见的限流算法有:令牌桶、漏桶。

令牌桶算法(Guava RateLimiter)

令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。

  • 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌;(此处可以在取令牌时执行)
  • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝;
  • 当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上;
  • 如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。

漏桶算法

漏桶作为计量工具时,可以用于流量整形和流量控制。

  • 一个固定容量的漏桶,按照常量固定速率流出水滴;
  • 如果桶是空的,则不需流出水滴;
  • 可以以任意速率流入水滴到漏桶;
  • 如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。

计数器

计数器来进行限流,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;只要全局总请求数或者一定时间段的总请求数设定的阀值则进行限流,是简单粗暴的总数量限流,而不是平均速率限流。

流量切换

预先分组,线上可实时配置。(Nginx配置权重)

设计降级机制(Hystrix)

指标:平均响应时间;异常比例;异常数

类型:

  • 自动开关降级和人工开关降级
  • 读服务降级、写服务降级
  • 多级降级

降级措施:

  • 读降级:暂时切换读(降级到读缓存、降级到走静态化 或 反之)、暂时屏蔽读(屏蔽读入口、屏蔽某个读服务); 页面降级、页面片段降级、页面异步请求降级
  • 写降级:异步同步,保证最终一致性

设计报警机制(P)

  • 系统报警、应用报警、网络报警
  • 一般和错误

规划日志处理和日志事件(P)

原则:确定事件可回溯,可分析;不严重影响应用系统

事中

  1. 确定问题类型(P)

    • 类型

      • 网络抖动引起的偶发性问题
      • 流量过大超系统阈值
      • 应用错误
      • 系统错误
      • 上线引发的代码错误
    • 来源

      • 系统监控
      • 用户投诉
  2. 评估影响范围

    个人,单渠道,子系统,站点级别

  3. 将调查情况回复BOSS

  4. 根据预案确定解决方案

    • 流量切换
    • 扩容
    • 降级:是否已自动降级,是否应手动降级
    • 重启服务:确定是否Dump内存
    • 回滚应用:针对上线引发的代码错误
  5. 成功后将解决方案抄送BOSS或问题来源

事后

  1. 问题确认:日志,内存,代码
  2. 问题修正:规划日志事件;修正代码;紧急上线或等下次正常上线
  3. 回复并备份问题解决情况,以防再次发生