一种http请求方式的数据同步策略
同步频率策略设计优化的思考
**************************************************
最高效与经济的同步策略,当然是与监测数据的产生高度一致,也即一条数据产生即同步,未产生时不进行额外的同步查询,以避免增加服务负担,
但基于实际设备的掉线情况比较严重,且设备的监测频率也会按需进行调整,所以同步频率跟踪数据频率也成为不那么好实现的事情,
因此,为达到同步相对的实时性,或者说可接受的延时,就需要进行一些冗余的同步查询,但增加查询次数对服务是有压力的,
以下的思考都是在保证同步相对的实时性的前提下,为减少不必要的查询次数而进行的思考,
其中最主要的方面,是设备本身数据延迟后,也就是设备掉线后,同步程序如何面对设备不确定的上线时间,
对程序而言,也就是程序应该以怎样的频率监听设备是否重新上线,或者说以怎样的频率查询服务端的数据是否又重新产生,
之前说过,这个查询对服务是有压力的,
我的结论是,为应对“高频查询以保证同步的实时性”和“更高频查询导致更大服务压力或者说更大服务宕机的可能性”这一对矛盾,
需要对“不同的设备”以及“设备的不同时段”进行优先级划分,
为实现这个优先级划分,需要给每个同步增加以下变量,并实现以下策略,
首先,对相关概念,简单定义如下:
1.数据频率,或称:监测频率,也就是监测数据产生的频率
,数据频率,通常为30、60、120分钟每条不等,现实中以60分钟每条居多,这里假设取值范围为10~120分钟,
2.同步频率,或称:查询频率,也就是向监测服务平台发送查询请求,并把查询到的数据向目的端同步的频率
,同步频率,分为实时数据的同步频率,和历史数据的同步频率,
3.实时数据和历史数据,简单定义为,最近T分钟内产生的监测数据为实时数据,T分钟之前的数据为历史数据,
T的取值范围,一般可设为数据频率值的1~2倍,参照数据频率值范围,计算可知,通常应在10~240分钟内,
T的默认值,可设为固定值60分钟,或者设为设备具体的数据频率值,
为保证同步的相对的实时性,和对服务更小的压力,
设计方案如下:
实时数据是两级变化的同步频率,分为首次同步查询和定时同步查询,历史数据是固定的同步频率,具体如下:
1.对实时数据的首次同步查询,应在距上次同步x分钟后,这个x可认为是实时数据同步的主频值,
x的取值范围,可设为数据频率值的0.2~2倍,参照数据频率值范围,计算可知,具体应在2~240分钟之间,且不应大于T值,
x的默认值,可设为数据频率值的0.6倍或36分钟,
2.对其后的T-x分钟,从简化实现考虑,可设为每m分钟同步查询一次,这个m可认为是实时数据同步的副频值,
m的取值范围,可设为数据频率值的0.1~2倍,参照数据频率值范围,计算可知,具体应在1~240分钟之间,且不应大于x值,
m的默认值,可设为数据频率值的0.2倍或10分钟,视具体情况,一般以5~15分钟为宜,
3.对历史数据的同步,从简化实现考虑,也可设为每n分钟同步查询一次,这个n是历史数据同步的频率,
n的取值范围,可设为数据频率值的0.05~2倍,参照数据频率值范围,计算可知,具体应在0.5~240分钟之间,且不应大于x值,
n的默认值,可设为数据频率值的0.2倍或10分钟,视具体情况,一般以5~15分钟为宜,
补充说明:
1.实时数据的定义值T和实时数据同步的主频值x,最大值都可设为数据频率值的2倍,是考虑对于不敏感数据,可允许不那么实时
2.实时数据同步策略未同步到数据时,是否要跳到历史数据同步策略?应该要
3.实时同步策略与历史同步策略时间重叠时,优先执行哪个策略?执行实时同步策略
以上同步策略的具体实现,需要定义一个bool类型的数组来控制在每m分钟或n分钟时间间隔内只执行一次,C#实现上,可使用BitArray(64)类型充当此数组,
当某个时间间隔内已执行一次同步查询,则该bool值设置为false,该时间间隔内的其他各次轮询判断此bool值并依此跳过,相关伪码如下:
var bitsUnDo = new BitArray(64);
bitsUnDo.SetAll(true); //同步前,64个bool值都初始化为true
int s = (Now.minutes - LastTime.minutes) - x; //计算当前时间与上次同步截止时间相差多少分钟,
int i = s / m; //计算当前是处在第几个m分钟时段内,
if(s>=0 && bitsUnDo[i]){ //在该第i个m分钟时段内,如还未同步过,则进行一次同步,并在同步后,把当前时段标记bUnDo[i]置为false,以避免重复
ToDo......
bitsUnDo[i] = false;
}

浙公网安备 33010602011771号