有一堆組,每組成員不定時進出組,且組內成員會有狀態,要求實現請求過來時,輪詢分配給特定狀態的成員。於是想到了經典的round-robin演算法,根據業務寫了個demo,如下:
<?php
/** * class roundrobin
* 不公平迴圈分配實現演算法
* 原理:
* 通過取模實現輪循排程
* 資料結構:
* * 許可權人員集合 [1,2,3,4,5]
* 初始輪循指標位置:4
* * 測試操作:
* 1.人員狀態變更
* 2.組內人員變更 (不公平)
*/class roundrobin
//人員上/下線
private function checkstatus()
//todo 加減組內成員 如果能實現動態輪尋就完美了 靜態有漏洞 會掠過部分客服
public function changegroupmembers()
//獲取當前組成員列表
public function getmembers()
public function choose() //未找到
continue;
}else}}
}//測試引數
$a = new roundrobin([1,2,3,4,5]);
echo '----第一輪排程-----'.php_eol;
for($i = 1;$i<10;$i++)
echo '----結束-----'.php_eol;
echo '----修改組內客服-----'.php_eol;
$a->changegroupmembers();
echo '----第二輪循排程-----'.php_eol;
for($i = 1;$i<10;$i++)
執行結果:
macbook-2:desktop lemon$ php roundrobin.php
當前組內成員: [1,2,3,4,5]
----第一輪排程-----
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 4
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 4
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 4
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 4
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 4
選中目標: 5
----結束-----
----修改組內客服-----
準備刪除成員: 4
----第二輪循排程-----
選中目標: 2 //******第二輪排程跳過了1*******
選中目標: 3
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 5
選中目標: 1
選中目標: 2
選中目標: 3
選中目標: 5
選中目標: 1
結果顯示,在模數變更之後,迴圈的指標沒有跟著變更,導致的新一輪的排程中,有的成員被略過,還有可能被重複排程,具體得看剔除的位置。所以單單靠取模來輪詢排程,有一定的缺陷,這種演算法適合靜態目標的輪詢,但是如果要實現動態計算指標位置,也不是乙個簡單的演算法,有違初衷。感興趣的朋友可以研究下,我還沒想到如何動態平衡指標,(ノへ ̄、)捂臉。。。但是有另一種演算法也可以實現動態平衡,那就是——引用計數,請看下篇文章——動態輪循排程演算法實現 (二)動態輪循排程演算法實現
想看上篇的童鞋請移步靜態輪循排程演算法實現 上篇說到,使用取模方式,沒有辦法實現公平輪詢排程,於是有了這篇,採用引用計數的方式實現動態輪詢排程。如下 class roundcounter 動態公平迴圈分配實現演算法 原理 通過整體迴圈計數和成員迴圈計數實現輪循排程 資料結構 許可權人員集合 1,2,...
LVS排程演算法(上) 靜態排程演算法
lvs的排程方法有十幾中,每種方法的排程標準和適用場景不同。大體有兩大類,分別為固定排程方法或稱為靜態排程方法,另一類是動態排程方法。常用的具體演算法有十種。1 輪詢排程 rr 將所有請求平均的分發到每個集群節點上,即輪流排程。2 加權輪詢排程 wrr 由於不同的伺服器效能不同,因此要考慮讓效能高的...
python3實現DNS網域名稱輪循業務監控
大部分的dns解析都是乙個網域名稱對應乙個ip位址,但是通過dns輪循技術可以做到乙個網域名稱對應多個ip,從而實現最簡單且高效的負載平衡,不過此方案最大的弊端是目標主機不可用時無法被自動剔除,因此做好業務主機的服務可用監控至關重要。本示例通過分析當前網域名稱的解析ip,再結合服務埠探測來實現自動監...