一種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;
}