要解决的问题 :
1.在电商项目中,如何准确的知道当前订单量是正常的
2.如何在订单量突变后快速感知
解决思路 :
实现一个关于订单量的监控系统,将历史数据与实时数据做对比,因为每天的订单量,基本都是一个相似的变化范围,比如凌晨4点的单量是一天中最少的,节假日的单量要小于工作日单量等等
前提条件 :
1.不影响当前系统的性能(主要是数据库的压力不能因为监控而受到影响)
2.减少误报,但杜绝漏报
方案 :
未来不可预知,但可预测.
基于以上这个逻辑,我们可以抽象出四个的模块来做,每个模块日后都可独立增强
1.收集整理模块 : 收集历史数据,统计单位时间片段内的数据
2.预测模块 : 根据收集模块中的数据,对未来数据进行预测
3.比较模块 : 将预测的数据与实时数据进行比对,得出结论
4.输出模块 : 将结果可视化的输出到前台
具体实现 :
1.收集整理模块
每个订单在入库后,都会发一个mq出来,我们就收集这个订单mq,将每个订单数据(订单号,mq时间)收集起来,存入库中(Mysql || Redis || HBase),待商榷
方案二:数据库主表增加触发器(insert),每当有insert操作就记录下来
每天凌晨4点作为临界点,根据历史数据预测到下一个凌晨4点之内的每个时间片段内的订单量
历史数据初步暂定选取前一周的数据(日后肯定要可选可删,比如删除促销的数据等)
时间片段暂定为一小时
2.预测模块
使用二次指数平滑法预测数据
有人问为什么用二次指数平滑法预测,先看看他的优缺点:优点:所需数据资料少,就可以预测出来所需要的结果,指数平滑法是在移动平均法基础上发展起来的一种时间序列分析预测法,兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。缺点:赋予远期较小的比重,近期较大的比重,所以只能进行短期预测。很明显,我们需要的就是他的优点,他的缺点我们又刚好可以避开
参考文章
3.比较模块
相同时间段内的实时数据与预测数据相比较,数据差在一定范围内则代表正常
4.输出模块
在一个图表上输出两条线,一条数预测数据,一条是实时数据,横轴是时间,纵轴是数量
后补(做出来的示例效果图):
注意事项:
清理脏数据:
如果某天带有促销活动,对订单量的影响较大,则最好不要当做计算预测数据的参考数据,尤其是近期的数据
预测出来的数据和实际数据到底差值在多少范围算正常,多少算不正常,这个一般因项目而异,但会有一个最终算法来解决
输出模块,可以考虑使用长连接,
原因1 : 是查看监控的用户时内网用户,同一时间一般就几个人,所以服务器压力不用考虑
原因2 : 实时性可以更好的,如果数据发送太快,使用短连接就会频繁的三次握手四次挥手,太累
常见的预测算法
预测算法——指数平滑法