在iot連線中,如果伺服器出現故障,會出現請求失敗,這時,微控制器就會一直向伺服器請求連線,當伺服器故障修復時,會面臨幾十萬的裝置同時訪問iot連線的介面,如果伺服器沒有很好的負載均衡,就又會面臨故障的危險。
這時,在產品的硬體客戶端,需要增加乙個退避演算法來實現延時連線,避免所有裝置同時連線。
生成 2n~2n+1之間的隨機數
int back_off(int n)
斐波那契數列(fibonacci sequence),又稱**分割數列指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:f(1)=1,f(2)=1, f(n)=f(n-1)+f(n-2)(n>=3,n∈n*)
由於要執行在微控制器上,記憶體有限,所有避免使用遞迴。
int fibonacci(int n)
else if(n == 1 || n == 2)
else
return rand()%(2*sum)+sum;
} }
生成f(n)~f(n+1)之間的隨機數
然後把連線失敗的次數累加,傳入n,延遲時間乘return出的隨機數
//初始化退避演算法
void retreat_init(void)
//退避演算法實現延遲
void retreat_work(void)
int sleeptime = fibonacci(retreat_count); //利用斐波那契數列實現退避
// int sleeptime = back_off(retreat_count); //二進位制指數退避
vtaskdelay(sleeptime * 1000 / porttick_period_ms);
pro_log_info("retreat sleep time :%d", sleeptime); //列印出log,可以用printf,這裡是封裝了一層函式
}
退避演算法實現延遲就完成了,是不是非常簡單 截斷二進位制指數退避演算法
截斷二進位制指數退避演算法 1.確定基本退避時間 基數 一般定為 2 也就是乙個爭用期時間,對於乙太網就是 51.2 s 2.定義乙個引數 k,為重傳次數,k min 重傳次數,10 可見 k 10 3.從離散型整數集合 0,1,2,2 k 1 中,隨機取出乙個數記做 r,那麼重傳所需要的退避時間為...
DelayQueue實現延遲訊息
最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay timeunit unit 方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...
php redis實現延遲佇列
基於redis有序集實現延遲任務執行,比如某個時間給某個使用者發簡訊,訂單過期處理,等等 我是在tp5框架上寫的,實現起來很簡單,對於一些不是很複雜的應用足夠了,目前在公司專案中使用,後台程序並沒有實現多程序,不多說,貼 不回排版,見諒 1 命令列指令碼 執行方法 php think delay q...