最近聚餐,小七被公司公认代码写的很优雅的朱大神表扬了,说看了这么多代码,就只有邀请短信那个功能的多线程用的好,这里把重构这块代码的思路写出来,毕竟思考一整天,编程半小时,重要的是思维。
业务需求
起飞前一定时间内,给满足条件的旅客发送可升舱信息。
逻辑整理
(1)查询可升舱航班(集合)
(2)查询每一个航班下可升舱旅客(集合)
(3)过滤旅客
(4)给满足条件的旅客,发送邀请升舱的短信
改造前
1、未做幂等和加锁,同一个接口,调多次,会造成数据积压和数据错误。
2、判断是否已经邀请,直接通过数据库查询,数据库压力过大。
3、发送短信需要旅客姓名,需要调用另一个接口获取旅客中文姓名,且接口调用时间过长需要1s左右。
4、整个接口都是同步的,包括发送短信。
5、数据入库时,是一条一条存储的。
改造后
1、增加分布式锁,防并发。
2、增加redis缓存。过滤数据,减少与数据库的操作,且查询时先通过缓存查找,提高系统吞吐量。
3、启用多线程调用第三方接口,并组装数据,提升效率。
4、使用mq解耦异步发送短信,因为发送结果不是重点,异步同步即可。
5、使用mysql批量插入,减少与数据库的交互。
程序运行速度对比
改造前,一个航班,100名乘客,邀请时长5-10分钟左右。
改造后,一个航班,100名乘客,初始化邀请需要2分钟(第一次邀请),第二次邀请2-4秒左右。