于 4月15日上线了优化版本的 EDM 代码,通过以上两图,可以看出在4月15日,服务器CPU负载有显著下降。
由于M2定时任务系统代码的缺陷,如果定时任务数量超过5000条(取决于服务器配置),会导致大量任务得不到执行(Missed),而状态为 missed 的任务并不会被清理,进一步加剧了定时任务调度的负载。
优化之前,EDM 系统是基于 Magento 的定时任务功能构建的,每隔 x 分钟就执行一个定时任务,这样会在cron_schedule表中产生非常多的定时任务记录;而在特定的EDM 任务中,需要进行大量的 mysql select、join 操作来筛选和判断是否需要发送 edm 。
此次优化之后,EDM 改为由用户在网站前台的特定动作触发,将用户信息通过消息队列保存到 Mysql 中,等到特定时间,再从 MySQL 中取出对应的数据,最后执行各种业务逻辑,对比优化之前,
不再依赖于定时任务,cron_schedule表的数据量控制在300以内,cron_schedule表减小进而降低了定时任务调度的负载 由之前的筛选+判断,多个用户逐一发送,转变为一个任务只对应一个用户,避免了复杂的 mysql join 操作 复杂的 mysql join操作,不方便debug, 比如QA没有收到Edm, 由于所有条件都写在复杂的 mysql join sql 中,不清楚具体是什么条件不符合,维护和测试非常不便 由用户在网站前端的特定操作触发,会将相关数据记录起来,在执行任务时,很容易就可以获取到这些数据,避免了不必要的mysql 查询