生产问题汇总

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

  1. Rcx推送用户在线状态, 改成用updateTime判断,只有当updateTIme 大于 数据库中的updateTIme时才更新 乐观锁用 synchronized(userid.intern()){}

  2. 死锁 更新同一个群组表时 ,如果同时操作群组123, 因为是更新同一条记录,数据库会加排他锁 线程A 更新群组表 (lock1) —— 更新群成员表(try lock2) — 等待线程B释放 lock2 线程B 更新群成员表(lock2) —— 更新群组表( try lock1) —- 等待线程A释放lock1

  3. 并发导致的数据问题 同时操作同一个群组123

线程A 修改群成员别名(系统当前时间为version) T1 更新群成员表的version(rel_group_member) ———sleep———— 更新群组表的version —覆盖更新了version为T1

线程B 修改群成员别名(系统当前时间为version) T2 更新群成员表的version(rel_group_member) ——————— 更新群组表的version —更新了version为T2

  1. 先查询,后更新的问题

线程A 先查询群成员的count, 再update count -1 ,最终两个更新的结果都是一样的数字 线程B 先查询群成员的count, 再update count -1 ,最终两个更新的结果都是一样的数字

  1. redis单线程问题 客户端使用keys * 导致阻塞生产get set命令

  2. 数据一致性问题 mysql 主从配置读写分离,由于binlog 同步延迟,导致主库更新后,从库未同步,从库读取到老数据

  3. 线程池未隔离导致服务雪崩

生产上IM对外提供的发送消息接口(接口逻辑主要是将消息写入Rabbitmq),由于Paas平台rabbitmq 在写入消息时,可能由于内存问题导致rabbitmq写入夯住,由于发送消息接口没有单独使用独立的线程池,导致服务OOM