事故 -- 2




美团存储架构PHP -> mgw(美团基础架构组对 lvs 的封装)-> atlas(数据库中间件) -> DB 事故描述mgw 机器 2月1日 11:30 突然宕机,导致 PHP 端大量读超时(10 秒),加锁的语句没有解锁,导致其他语句无法获取锁造成死锁 然而,由于 rabbitmq 1.6.1 心跳设置的是 2 秒,两次(4 秒)检测不到心跳就会将消息重新发送给另一个 worker,所以在 PHP 读超时前,相同消息被 rabbitmq 转发到了另一个 worker,造成了雪崩效应 大量重复 SQL 被提交 DB 执行,select for update 语句造成死锁,因此要求 DBA kill 掉死锁连接,结果 DBA kill 掉了所有连接,造成订单丢失,mysql insert  操作即使没有显式开启事务,执行
#技术帖    #php    #mysql    #技术分享   
事故描述2015-09-21 15:43:34 到 2015-09-21 16:13:45 之间用户通过客户端 APP 查看“我的订单”列表会查看到同时登陆的其他用户订单2015-09-21 16:13:45 到 2015-09-21 16:36:17 之间用户无法查看客户端 APP 查看“我的订单”列表页面 事故原因分析spring 框架的 bean 默认以单例模式(这里并不是指 GOF 设计模式中的单例模式,而是在 spring 的 IOC 容器中只会存在一个该 bean 创建的对象)启动,这个类对象的成员数据共享,因此用户的请求数据被共享,后到的 request 覆盖了已经存在的 request 数据,等待的用户返回了后到的用户查询到的结果 关于测试测试过程中可以避免这个问题的发生吗?测试没有模拟并发的问题,这个问题是无法出现的,这也是事故发生后一个多小时无法定位到的主要原因 -- 不能在测试环境中复现然而,小流量上线显然是可以触发的,然而,在小流量上
#技术帖    #php    #技术分享    #work   



京ICP备2021035038号