削峰填谷在短信提醒中的应用

原来各间诊所的短信提醒服务是按时分批发送的,比较老的诊所病人多,一批就发送百多条短信。显然收到短信的人,按短信提供的电话,打电话给诊所的柜台预约看诊的话,就会像山洪爆发,大水漫灌,使得柜台忙不过来,造成了电话打不进去的现象。连续发送内容相同的短信还会造成另外一个大问题,那就会被某些电信公司莫名其妙地给禁止短信发送,请参阅《随机序列和负载均衡在短信服务器的应用》

为了解决被禁止短信发送的问题,将各间诊所分时分批发送的短信提醒,改为先将提醒的信息发送到短信服务器的缓存队列,再由短信服务器重新组合,分批发送给病人。待短信服务器将所有的短信发送完成后(由于小批量发送,需要数个钟头),各间诊所再从短信服务器取回短信发送结果,并根据发送结果注册下一次的提醒。由于历史原因,诊所病人资料里面的手机号码,可能包含了电话号码,传真号码以及被停用的手机号码。为了去除那些无法接收短信的号码,注册下一次提醒时,便会以成功发送为依据。对于那些发送不成功的当成是无效号码不予注册。除了这个自动注册每半年提醒外,每天来看诊的新病人也会自动加入到提醒队列,由于节假日以及每天看诊的人数不同,造成了同一间诊所每天短信提醒的人数差别很大,相邻日子的短信数量差别可能高达数倍。

这奇怪的现象经过认真调查分析,发现短信提醒,整个系统高度依赖互联网,不管是诊所的网络,短信服务器的网络,还是电信公司的互联网(包括停机维护),任何一方出问题都会造成发送不成功,发送不成功的号码无法继续注册,造成短信提醒中断。没有了先前的常规病人单靠新进来看诊的病人,数量很少,这就造成了前后天相差数倍的原因。

短信提醒人数差别太大,不利于诊所的运作,得想办法消除差距,这里采用了削峰填谷的方法。

首先读取一段时间的短信提醒。这里采用七天,也就是一个星期内的每天要发送的短信数量,取得每天发送的平均值,然后按每天发送数量从低谷到高峰排序。然后从低谷端开始,读取日期并取该日与平均值的差值v,在反方向从高峰端读取日期并取该日与平均值的差值p。如果高峰端的差值p大于低谷端的差值v,则将高峰端的v个短信移到低谷端(填平低谷端),如果高峰端的差值p小于低谷端的差值v,则将高峰端的p个短信移去低谷端(削平峰值)。低谷端不足部分,再从下一个高峰端取,直到填平为止。如此继续下一个操作,直到全部低谷端都填平为止。

原来每天短信数量
从低到高索引后,进行削峰填谷操作
削峰填谷前后对比

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注