带你读《2022技术人的百宝黑皮书》——mysql锁机制的再研究(5)https://developer.aliyun.com/article/1340029?groupCode=taobaotech
业务场景分析
复现出问题,在结合业务流程去排查和分析,发现问题出自结算域的多个定时任务中,这些定时任务的使用分布式定时框架,执行模式为网格计算,结算的每条记录都有主键id, 活动id和商家id以及用于计算结算金额的投放数据uv 和pv等,原定时任务的处理逻辑是by最细粒度的活动数据主键id步进分发到各个机器上,每个机器通过id查找计算应结算金额,然后开启事务-》加锁-》执行扣款操作(涉及解冻等复杂逻辑,会进行多表操作)-》释放锁-》提交事务。
注:网格计算本质上是通过并发提来提升任务的处理速度,分为主任务和子任务,主任务负责按照自定义规则分发子任务到各个机器上,子任务互不干涉同步运行。
解决方案
通过业务场景梳理,很容易就发现2个设计问题-并发和大事务。
并发
因配置不当,人为造成高并发场景。针对并发我们进行了两种方式的改造:
因配置不当,人为造成高并发场景。针对并发我们进行了两种方式的改造:
- 针对只有少量数据的结算任务,改成单机运行,实例并发数设置为1。
- 针对大数据量的结算任务,主任务的分发逻辑从基于id步进分发,改为基于sellerId纬度分发,原因是结算是基 于商家纬度进行的,分布式锁的纬度也是sellerId。
大事务
大事务导致独占区变大(加解锁的逻辑也归属与独占区了),增加了冲突概率,相当于变相提升了并发度。
针对大事务问题,因为本质上锁的方案和业务执行逻辑完全无关,这里将技术问题和业务逻辑进行了耦合,故按照解耦的思路将加锁和解锁操作开启独立子事务,减少冲突的概率。
参考文献
- MySQL锁介绍与加锁分析
- insert 语句加锁机制(https://cloud.tencent.com/developer/article/1181532?from=14588)
- 如何阅读死锁日志(https://cloud.tencent.com/developer/article/1181190)
- MySQL死锁案例分析(https://cloud.tencent.com/developer/article/1892524?from=ar ticle.detail.1181187)
- MySQL · 引擎分析 · InnoDB行锁分析(http://mysql.taobao.org/monthly/2018/05/04/)
- MySQL锁系列(七)之 锁算法详解(http://keithlan.github.io/2017/06/21/innodb_locks_algorithms/)
- mysql 查看谁在持有锁(http://www.javashuo.com/article/p-wixmuvea-co.html)
团队介绍
行业与品牌营销团队
我们是一只有凝聚力、有活力的团队,主要负责打通淘系业务中商品,商家,前台场景等生产要素,重点围绕着运营,商家及品类架构体系的数据化、智能化、规模化和平台化做核心突破方向,同时联合各技术团队和业务团队, 共同打造电商运营操作系统。
【春招校园招聘】:java开发实习生、数据实习生
【招聘范围】:2023年毕业生
【工作地点】:杭州
如果您有内推需求,可将简历发至邮箱lx240393@alibaba-inc.com或添加作者微信lixstudy进行详细咨询,欢迎 来撩~