文章出處
文章列表
thrift、avro、grpc之類的rpc框架默認都沒有提供負載均衡的實現,生產環境中如果server只有一臺,顯然不靠譜,于是有了下面的設計,這其實是前一陣跟北京一個朋友在qq群里交流的結果,分享一下:
主要思路:
1、rpc server端以多實例方式運行(多端口或多機部署均可),啟動時每個實例向zk集群以臨時節點方式注冊(這樣,遍歷zk上/server下有多少個臨時節點就知道有哪些server實例在線)
2、客戶端自己實現一個連接池,連接池初始化時,從zk將在線的server實例信息同步到本地并緩存,同時監聽zk下的節點變化,然后建立連接若干(簡單考慮的話,可以與每個server實例建立一個連接)
3、客戶端需要與Server通訊時,從連接池中取一個可用的連接,用它實現遠程調用。
需要考慮的細節:
連接池其實是關鍵,要設計完善的話,還是有很多細節要認真考慮:
a) 連接池的初始連接數、最低連接數、最大連接數,這些都是要考慮的。
b) 如果長時間沒有client調用,要有額外機制來釋放閑置連接(可以額外開一個線程定時檢測)
c) 如果server端,某個實例down掉,要考慮將對應的連接置為不可用,或者直接釋放。
d) 沒有可用連接時,如果池中的連接數<最大連接數,要考慮主動創建新連接。
e) 所有連接都占用,也無法創建新連接時,要有通知機制(郵件、短信之類的都行)及時通知運維人員,提示新增server實例。
文章列表
全站熱搜