Dubbo中負載均衡策略有:1、隨機選取提供者策略,能夠隨機轉發請求;2、輪循選取提供者策略,可以使請求平均分布;3、最少活躍調用策略,能夠讓慢提供者接收更少的請求;4、一致性Hash策略,相同參數請求總是發到同一提供者,如是一臺機器宕機,可以基于虛擬節點,分攤至其他提供者。
具體內容如下:
在分布式系統中有多臺的服務器作為提供者負責處理各種網絡請求,當同時有多個請求同時過來時,需要將其均攤在各臺服務器上,避免了某臺服務器壓力過大而某臺服務器則閑置的問題。
Dubbo提供了四種實現負載均衡的機制:
1、基于權重隨機算法的 RandomLoadBalance
這種方式的思想是為每一臺服務器設置一個權值,當有請求到來時就按照大體的權重比例為該請求分配服務器。
如圖當orderService的消費者請求userService服務時,因為已經提前設置了權重,每個請求都會按照權重的比例分配到相應的服務器上,若有7個服務陸續發出請求,其中有2個請求將會發送到1號服務器,4個將會發送到2號服務器,1個發送到3號服務器。而即便是有權重比例,請求還是會隨機分配給每一個服務器,只是大體上會按照權重的比例而分配。
2、基于最少活躍調用數算法的 LeastActiveLoadBalance
這種思想會讓每一個服務提供者對應一個Active活躍數,剛開始時每臺服務器的Active數均為0,每收到一個請求時,Active就加一,當下一次再有請求過來,就會將該請求分配給Active數較小的服務提供者。而在實現上還會為每臺服務器設置一個權重,當兩臺服務提供者的Active相同時且是最小時,就按照權重的大小為請求分配服務器。當然如果服務器的處理效率越高,Active數就會越少
3、基于 hash 一致性的 ConsistentHashLoadBalance
直接上圖解釋吧
當orderService發送一個帶id參數的方法請求時,會根據這個id分配給對應的服務器;當id=1時會將請求分配給服務提供者1,當id=2時,會將請求分配給服務提供者2,以此類推…
4、基于加權輪詢算法的 RoundRobinLoadBalance
這種算法的思想首先要說到輪詢,比如說有三臺服務器,第一個請求將會分配給1號服務器,第二個請求分給2號服務器,第三個請求將會分配給3號服務器,第四個請求又重新分配給了1號服務器,以此輪詢。而基于加權的輪詢算法則是會根據每臺服務器的性能為服務器設置一個權值,加權后,每臺服務器能夠得到的請求數比例,接近或等于他們的權重比。比如服務器 A、B、C 權重比為 5:2:1。那么在8次請求中,服務器 A 將收到其中的5次請求,服務器 B 會收到其中的2次請求,服務器 C 則收到其中的1次請求。