Skip to content

2018-12-29

事故类型

全局故障

事故过程

  1. 钉钉和电话报警收到 MA 大量 5xx 报错消息,涉及多个客户的多个接口
  2. 通过日志初步判断是 MySQL 连接问题,回滚了代码

事故时长

14分钟(11:40 - 11:54)

事故原因

commit c00425b29eda6df8ee774cc81e74883cbd04012d 中增加了一个 中间件

class DBSqlAlchemySessionMiddleware(object):

    def _remove_sessions(self):
        DbWriteSession.commit()
        DbWriteSession.remove()
        DbReadSession.remove()

    def process_view(self, request, callback, callback_args, callback_kwargs):
        pass

    def process_exception(self, request, exception):
        self._remove_sessions()

    def process_response(self, request, response):
        self._remove_sessions()
        return response

这个中间件会在报错时删除 session,导致同一个进程中的下一个请求无 session 可用。

解决思路

版本上线前提前压测,通过自动化测试发现这样的问题。(如果自动化测试用例中又 session 回滚的用例的话就能发现这个问题)