我為什麼要設計自己的流量排程演算法?

2021-09-07 14:58:23 字數 1474 閱讀 7491

公司使用阿里的雲主機部署計算型的服務,就是特別耗cpu的那種。使用過程中有一件事情很苦惱,那就是雲主機的效能是不一致的,機器間的效能可相差30%,更嚴重的是由於是共享雲主機,經常在晚上8點鐘左右(各大**的高峰期)有某些機器的系統cpu突然飆高(原因是一次系統呼叫消耗突然增加,系統cpu能飆到90%,機器基本不可用)。這個問題其實很好解釋:阿里雲在同乙個物理機上虛擬好多雲主機,並且雲主機之間隔離做的不好,一台雲主機可能會影響同一物理機上的另一台雲主機,導致你的雲主機效能有問題的可能是另外一家公司使用的雲主機。多次向阿里提出這個問題,阿里並沒給啥解釋,就是推薦我們換一台雲主機試試(這是玩我呢麼?)。而我要在這麼不靠譜的機器上要做到服務穩定,最需要解決的問題就是如何動態的根據機器的效能變化調整分配給每台機器的流量。

阿里的slb提供了幾種流量排程演算法:輪詢排程、加權輪詢排程、最小連線數優先排程。

所以,最終我放棄了。看來必須自己解決這個問題,那麼就順手寫個流量排程演算法吧。

首先要明確我們想要解決的問題是根據機器的效能分配流量,面對的第乙個難題就是如何實時的獲取機器效能資訊呢?大多數小夥伴的思路是實時獲取機器的cpu資訊,但是我認為這太複雜,還需要開發一套實時收集cpu資訊的輔助系統,不划算。我只利用乙個資訊:某段時間內呼叫某個機器上服務的失敗次數。

第二個問題就是客戶端自適應演算法不是全域性感知。我說的全域性感知是:由統一的服務收集並記錄客戶端呼叫每個服務的失敗次數,客戶端根據這個集中統計資料來分配流量。我們不採用全域性感知,就意味著每個客戶端根據自己當前得到的資訊進行區域性的流量分配,這可行嗎?可行!如果客戶端數量足夠多,根據統計學意義,所有區域性感知的結果彙總和整體感知的效果基本相當。當客戶端數目不夠多的時候呢?反證法:如果存在乙個服務接收過量的請求,那麼推測肯定有某一客戶端呼叫該服務會失敗,那麼該客戶端就會主動減少對這台後端的服務的呼叫,從而減少這個有問題服務接收的請求數。接下來說說說演算法設計思路:初始時設定每台後端機器的權重w=10,當超時10次的時間間隔(最後一次超時的時間戳與第一次超時的時間戳相差)小於10s時,則對這台機器的權重減1,從而減少10%的流量。

但是現在這個排程演算法並不完善,有如下幾個問題要解決。

如何使用我們的演算法呢,例項如下:

address addr;

algorithm *algorithm = new

weightselectalgorithm(...);

algorithm->next(addr); //

選擇乙個服務

int ret =request(addr);

if(ret != 0

) else

我這裡只給大家提供了這個設計思路,具體**實現我相信難不倒各位小夥伴,這裡就不貼了。演算法初始化時需接受一些配置引數,一定要保證這些引數可以手動調整,直到達到滿意的效果位置。這個演算法上線後的效果還是挺好的,請求失敗的次數能夠降乙個量級,由於客戶端有重試策略,最終失敗的呼叫次數可以忽略不計。

我為什麼要設計自己的流量排程演算法?

公司使用阿里的雲主機部署計算型的服務,就是特別耗cpu的那種。使用過程中有一件事情很苦惱,那就是雲主機的效能是不一致的,機器間的效能可相差30 更嚴重的是由於是共享雲主機,經常在晚上8點鐘左右 各大 的高峰期 有某些機器的系統cpu突然飆高 原因是一次系統呼叫消耗突然增加,系統cpu能飆到90 機器...

我為什麼要累死自己不掙錢?

老師對我們想做程式設計師的同學說,往屆做電子商務的,一般乙個月也能拿三四千,多的到七八千,工作也很輕鬆。而做程式設計師的乙個月最多的 也就三四千,而且他們的鴨梨好大。沒做今年就變老了。老師說完後補充一句 為什麼要累死自己不掙錢呢?我想做程式設計師,所以我申請了加入黑馬訓練營。我不是沒有選擇或者很少選...

為什麼我要學習設計模式

一 什麼是設計模式 設計模式是指在軟體開發過程中,經過驗證的,用於解決在特定環境下,重複出現的 特定問題的解決方案。摘自 研磨設計模式 設計模式是解決一類問題的方法,就像演算法那樣,是解決一類問題的 設計模式是經驗的積累,不一定是最好的,但是模式可以幫助我們更好的解決問題 設計模式是變化的 二 為什...