Ribbon 支持的9大負載均衡策略

個人博客 :https://www.siyuan.run
CSDN:https://blog.csdn.net/siyuan
微信小程序:思遠Y

  1. 線性輪詢策略: RoundRibbonRule

    BaseLoadBalancer 負載均衡器默認采用線性負載輪詢負載均衡策略。

    工作流程:

    1. RoundRibbonRule 類的 choose(ILoadBalancer Ib,Object key) 方法初始化一個計數器。
    2. incrementAndGetModulo() 方法獲取一個下標 (是先加1,然后和服務清單總數取模獲取到的,不會越界),是一個不斷增長的數。
    3. chooseServer(Object key) 方法拿著下標去服務列表中獲取服務,每次循環計數器都會加1。如果連續10次都沒有取到服務,則會報 “No available alive servers after 10 tries from loadbalancer.” 警告。
  2. 重試策略:RetryRule

    重試策略在使用 RetryRule 類中定義的 choose(ILoadBalance Ib,Object key) 方法來選擇一個服務實例。

    choose() 方法也是采用 RoundRibbonRule 中的 choose() 方法來選擇一個服務實例的。

    工作流程

    1. 如果選擇到的服務實例正常,則返回數據。
    2. 如果選擇到的服務實例為 null 或 失效,則 choose() 方法會在失效時間前不斷地進行重試。
    3. 如果超過了失效時間還是沒有取到,則返回一個 null。
  3. 加權響應時間策略:WeightedResponseTimeRule

    WeightedResponseTimeRule 類是 RoundRibbonRule 的一個子類,它對 RoundRibbonRule 的功能進行了擴展。它根據每一個服務實例的運行情況先計算出該服務實例的一個權重,然后根據權重進行服務實例的挑選,這樣能夠調用到更優的服務實例。

    工作流程

    1. 每 30S 計算一次各服務實例的響應時間,以響應時間來計算權重。平均響應時間越短則權重越高,權重越高則被選中的的概率越高,反之則被選中的概率較低。
    2. WeightedResponseTimeRule 中有一個名叫 DynamicServerWeightTask 的定時任務。它是一個后臺線程,定期從 status 里面讀取響應時間,用來計算每個服務實例權重。
  4. 隨機策略:RandomRule

    隨機選擇一個可用的服務實例。

    工作流程

    1. 負載均衡通過 upList() 和 allList() 方法獲得可用服務實例列表,然后初始化了一個 Randow 對象以生成一個不大于服務實例總的隨機數。
    2. choose() 方法將該隨機數作為下標獲取一個服務實例。輪詢 “index” 選擇 “index” 對應的服務實例。
  5. 客戶端配置啟動線性輪詢策略:ClientConfigEnabledRoundRobbinRule

    繼承該策略默認的 choose() 方法就能實現線性輪詢機制。

  6. 最空閑策略:BestAvailableRule

    該服務是逐個考察各服務實例,然后選擇一個最小的并發請求的服務實例來提供實例。BestAvailableRule 繼承自 ClientConfigEnabledRoundRobbinRule 類。

    工作流程

    1. 根據在 loadBalancerStats() 方法中保存的服務實例的狀態信息來過濾失效的服務實例。
    2. 判斷 loadBalancerStats 是否為空。
      1. 如果 loadBalancerStats 不為空,則找出并發請求最小的服務實例來使用。
      2. 如果 loadBalancerStats 為空,則 BestAvailableRule 類將采用它的父類。即 ClientConfigEnabledRoundRobbinRule 的服務選取策略 (線性策略)。
  7. 過濾性線性輪詢策略:PredicateBasedRule

    PredicateBaseRule 類是 ClientConfigEnabledRoundRobbinRule 類的一個子類,它通過內部定義的一個過濾器過濾出一部分服務實例清單,然后用線性輪形的方式從過濾出來的服務實例清單中選取提個服務實例。

  8. 區域感知輪詢策略:ZoneAvoidanceRule

    該策略以區域、可用的服務器為基礎,選擇服務實例并對服務實例進行分類。ZoneAvoidanceRule 類是 PredicateBasedRule 類的一個實現類,它有一個組合過濾條件 (CompositePredicate)。ZoneAvoidanceRule 類中的過濾條件是 “以 ZoneAvoidancePredicate() 方法為主過濾條件” 和 “以AvailabilityPredicate() 方法為次過濾條件” 組成的。在過濾成功后,繼續采用線性輪詢的方式從過濾結果中選擇出一個服務實例。

  9. 可用性過濾策略:AvailabilityFilteringRule

    該策略根據服務狀態 (宕機和繁忙) 來分配權重,過濾掉那些因為一直連接失敗或高并發的服務實例。它使用一個 AvailabilityPredicate() 方法來包含過濾邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fedora20開機啟動配置:systemctl

老版fedora中使用chkconfig配置開機啟動,fedora20中,使用chkconfig會出現各種問題。使用systemctl配置。 具體表格如下 轉載于:https://www.cnblogs.com/hh6plus/p/5548083.html

Mysql 字符操作函數相關

常用的字符串函數: 函數說明CONCAT(s1,s2,...)返回一個或多個待拼接的內容,任意一個為NULL則返回值為NULL。CONCAT_WS(x,s1,s2,...)返回多個字符串拼接之后的字符串,每個字符串之間有一個x。SUBSTRING(s,n,len)、MID(s,n,len)兩個…

“cvSnakeImage”: 找不到標識符

1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C2065: “CV_VALUE”: 未聲明的標識符1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C3861: “cvSnakeImage”: 找不到標識符 增加頭文件 #include <opencv2/l…

Shell 快速入門

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 概述 Shell 是一個用 C 語言編寫的程序&#xff0c;它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言&#xff0c;又是一種程序設計語言。 Shell…

Andriod開發 --插件安裝、環境配置、問題集錦

1.用Eclipse搭建Android開發環境和創建第一個Android項目&#xff08;Windows平臺&#xff09; 鏈接閱讀http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 搭建環境中的不同之處&#xff1a; &#xff08;1&#xff09;我在安裝過程中&#xff0c;在安裝ADT…

《Java 高并發》01 高并發基本概念

基本概念 同步和異步 同步和異步通常是用來形容一次方法調用。 同步方法調用一旦開始&#xff0c;調用者必須等到方法返回才能繼續執行后續操作。 異步方法調用更像一個消息傳遞&#xff0c;一旦開始&#xff0c;方法調用就會立即返回&#xff0c;調用者就可以繼續后續的操…

Android之Http網絡編程(四)

前面幾篇博文簡單的介紹了一些常見的Http的操作&#xff0c;這些操作幾乎都是在新開的線程中進行的網絡請求&#xff0c;并在日志中打印出獲取到的網絡數據。那么&#xff0c;問題來了&#xff01;&#xff08;呃~感覺下一句是藍翔有木有&#xff1f;&#xff09;如何在把獲取到…

《Java 高并發》02 多線程的特性

多線程的三大特性&#xff1a;原子性、可見性和有序性。 原子性 原子性是指一個操作或者多個操作&#xff0c;一旦開始就不會被其他線程干擾&#xff0c;即使是在多個線程一起執行的情況下也不會被干擾。或者不執行。 原子性主要是為了保證數據一致&#xff0c;線程安全問題…

U3D-FSM有限狀態機的簡單設計

http://coder.beitown.com/archives/592 在之前的文章里介紹了一個基礎U3D狀態機框架&#xff08;Unity3D游戲開發之狀態流框架&#xff09;即大Switch的枚舉狀態控制。這種方法雖然容易理解&#xff0c;編程方法也相對簡單&#xff0c;但是弊端是當狀態變得復雜之后&#xff0…

《Java 高并發》04 線程的基本操作

新建線程 新建線程很簡單。只要使用new 關鍵字創建一個線程對象&#xff0c;并且調用 start 方法啟動線程。 Thread t new Thread(); t.start();注意&#xff1a;run 方法不是用來啟動線程。如果調用 run 方法它只會作為普通方法來執行&#xff0c;而不會開啟線程執行。 終止…

Dispatch 方法簡介

后臺執行 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //后臺程執行 something; }); 主線程執行 dispatch_async(dispatch_get_main_queue(), ^{// 主線程執行something; }); 一次性執行 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 主…

linux雜七雜八整理

64系統里執行32位程序&#xff1a; 1、在64系統里執行32位程序如果出現/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory&#xff0c;安裝下glic即可sudo yum install glibc.i6862、error while loading shared libraries: libz.so.1: cannot …

《Java 高并發》05 線程的基本操作

volatile 與 Java 內存模型 Java 內存模型都是圍繞著原子性、有序性和可見性展開的。為了在適當的場合&#xff0c;確保線程間的原子性、有序性和可見性。Java 使用了一些特許的操作或者關鍵字來申明、告訴虛擬機&#xff0c;在這個地方&#xff0c;要尤其注意&#xff0c;不能…

mybatis 2 -常用數據操作

1、寫入數據并獲取自增ID XML配置&#xff1a; <!-- 寫入數據獲取自增ID --><insert id"insertLog" parameterType"com.mamaguwen.entity.sys_loginlog" useGeneratedKeys"true" keyProperty"logid">insert into sys_…

Spring常用的的注解對應xml配置詳解

Component(value"")注解&#xff1a;組件 標記在類上&#xff0c;也可以放在接口上注解作用&#xff1a;把AccountDao實現類對象交由Spring IOC容器管理 相當于XML配置文件中的Bean標簽 <bean id"userAnnonMapper" class"com.spring.mapper.User…

安卓模擬器bluestacks mac地址修改教程

http://szmars2008.blog.163.com/blog/static/118893702201373181349348/ 轉載于:https://www.cnblogs.com/prayer521/p/4069037.html

Docker 搭建 ELK 日志系統,并通過 Kibana 查看日志

Docker 搭建 ELK 日志系統,并通過 Kibana 查看日志 docker-compose.yml version: 3 services:elasticsearch:image: elasticsearch:7.7.0 #鏡像container_name: elasticsearch #定義容器名稱restart: always #開機啟動&#xff0c;失敗也會一直重啟environment:- "cl…

蟠桃記

Problem Description 喜歡西游記的同學肯定都知道悟空偷吃蟠桃的故事&#xff0c;你們一定都覺得這猴子太鬧騰了&#xff0c;其實你們是有所不知&#xff1a;悟空是在研究一個數學問題&#xff01; 什么問題&#xff1f;他研究的問題是蟠桃一共有多少個&#xff01; 不過&#…

Spring 定時任務動態管理

管理 Spring 中定時任務 pom.xml <properties><hutool.version>5.6.6</hutool.version><lombok.version>1.18.20</lombok.version><spring-boot.web.version>2.2.10.RELEASE</spring-boot.web.version> </properties><de…

高效率Oracle SQL語句

1、Where子句中的連接順序&#xff1a; ORACLE采用自下而上的順序解析WHERE子句。 根據這個原理&#xff0c;表之間的連接必須寫在其他WHERE條件之前&#xff0c; 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。 舉例&#xff1a; (低效) select ... from table1…