- 近期持续学习或实践的全栈技术是什么:Redis分布式锁
- 原理:分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在多线程或者多进程并发的情况下,使用锁来保证一个代码块在同一时间内只能由一个线程执行;
- 加锁是用SET命令,然后带上NX参数,key是锁名字,value是持有者id,再加一个过期时间,这里value要用持有者id的原因是谁申请、谁释放的原则,会在解锁时进行检查,过期时间是为了兜底,防止异常情况下锁被永久占据。
- 解锁的话,主要涉及两步操作,一个是查看是不是自己的锁,如果是接着就是释放锁,为了保证原子性,解锁需要用LUA脚本进行。
- 结合实际项目:小米请假线上问题排查-分布式锁
- 问题:小米请假系统-员工发起请假后,飞书日程重复创建
- 原因: 定时任务和回调同时触发而创建两个日历
- 系统概述:小米请假内部考勤系统-飞书小程序,
- 数据流转链路:
- 请假提交:提交表单数据->数据校验->调用BPM创建审批流->调用PS创建的申请记录->->创建请假记录
- 请假审批:审批中间节点回调->保存请假申请审批中间数据->审批最终节点回调->保存请假申请审批最终数据->请假申请成功/失败->调用飞书接口创建飞书日程->更新数据库日程ID、处理状态
- 定时任务(同步BPM审批流到PS补偿任务):每分钟抓取过去 7 天内未处理的回调数据,走审批最终节点逻辑
- 解决:封装Redis分布式锁工具库,在创建日程的核心逻辑上使用 try-catch-finally 的形式包裹,try中核心逻辑和加锁,finally做解锁。
大约 4 分钟