dubbo的那些高可用機制
作為經典的RPC架構,dubbo除了簡單的服務遠端調用功能,還會有哪些機制來保證它的高可用呢?
1. 注冊中心當機
由于我們的注冊中心使用的是zookeeper、redis等,是有可能出現當機情況的,那麼dubbo中是如何在注冊中心當機的情況下繼續服務的呢?
本地緩存
注冊中心僅僅是提供了我們發現服務ip和port的功能,但如果我們已經知道了服務提供者的ip和port那麼為什麼還需要注冊中心呢?
是以,在每一次的服務發現之後,dubbo都會将服務對應的節點資訊儲存在本地緩存,下一次在調用就不需要通過注冊中心了。
我們可以簡單的使用一個ConcurrentHashMap來實作。
那如果本地緩存失效了呢?那就是服務方的問題,與我們的zookeeper當機沒有關系,是以調用者會使用舊的ip資訊不斷重試,知道達到重試次數上限。
2. 服務降級
為了應對高并發,我們的伺服器需要對一些非核心業務進行必要的降級,以保證伺服器不會當機,降級的思路有兩種:
屏蔽
對非核心服務,不再進行網絡傳輸,而是直接傳回預設值
容錯(動态)
對于調用失敗的服務,不再進行重試,而是直接傳回預設值
3. 服務容錯
如果我們遠端調用失敗了,那麼應該怎麼處理呢,通常來說,這種問題都沒有最優解,隻有最适合的解決方案。來看看dubbo提供了哪些容錯方案吧。
failover重試(預設)
字面意思,一台伺服器失敗了,那就試試别的伺服器吧
failfast快速失敗
失敗了就報錯
failsafe失敗安全
不管,失敗了直接忽略
failback重發
我一定要成功!重新發起請求,可以設定重發次數
forking并行調用
同時請求多台伺服器,有一個成功就傳回!
boardcast廣播
廣播調用所有提供者,任意一台報錯即失敗