2018-12-29
事故类型
全局故障
事故过程
- 钉钉和电话报警收到 MA 大量 5xx 报错消息,涉及多个客户的多个接口
- 通过日志初步判断是 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 回滚的用例的话就能发现这个问题)