spring cloud微服務(wù)架構(gòu)(二):雪崩效應(yīng)與Hystrix基本原理

1 雪崩效應(yīng)

簡單是來說,在分布式系統(tǒng)中,假如有一個請求需要調(diào)用A服務(wù),但A服務(wù)出現(xiàn)了問題,則這個請求就會阻塞,那么只要調(diào)用服務(wù)A的請求都會阻塞,當(dāng)阻塞的請求越來越多,占用的計算機資源就越來越多。進一步來說,就是一個服務(wù)出現(xiàn)問題,可能導(dǎo)致所有的請求都不可用,從而導(dǎo)致整個分布式系統(tǒng)都不可用,這就是“雪崩效應(yīng)”。

image.png

如果要是考慮服務(wù)與服務(wù)之間的依賴關(guān)系,則連帶作用更強,系統(tǒng)崩壞的速度更快!

舉例來說:火車購票系統(tǒng)提供兩種服務(wù),查票服務(wù)和訂票服務(wù)

  1. 如果不考慮兩個服務(wù)之間的依賴關(guān)系:查票服務(wù)出現(xiàn)問題,則查票的請求全部阻塞,占用大量的系統(tǒng)資源,久而久之,導(dǎo)致整個系統(tǒng)無法響應(yīng)請求
  2. 如果考慮依賴關(guān)系:訂票服務(wù)依賴查票服務(wù),查票服務(wù)出現(xiàn)問題,不僅僅查票的請求會全部阻塞,訂票的服務(wù)也會阻塞,整個系統(tǒng)迅速崩壞!

2 Hystrix如何去解決雪崩

2.1 隔離技術(shù)

例如,貨船為了進行防止漏水和火災(zāi)的擴散,會將貨倉分隔為多個,如下圖所示:

image.png
  • 線程池隔離

例如,淘寶的一個商品頁面至少包含三方面信息,商品基本信息、商品價格、買家評論。一個商品頁面的請求依賴于三個服務(wù),基本信息服務(wù)A、價格服務(wù)B、評論服務(wù)C。因為是一個請求(線程)調(diào)用三個服務(wù),調(diào)用順序為:A->B->C,如果其中A服務(wù)出現(xiàn)問題,則另外兩個服務(wù)都無法調(diào)用;如果B服務(wù)出現(xiàn)問題,則C服務(wù)無法調(diào)用?!緳M向調(diào)用】

image.png

線程隔離主要解決的問題就是,A、B、C服務(wù)之間無調(diào)用順序的限制,不論哪個服務(wù)出現(xiàn)問題,都不會影響其他服務(wù)的調(diào)用。但是前提是A、B、C服務(wù)之間相互獨立。基本原理是,為每個服務(wù)維護一個線程池,用戶的請求將不再直接訪問服務(wù),而是通過線程池中的空閑線程來訪問服務(wù)。【縱向調(diào)用】

image.png
  • 信號量隔離

該隔離技術(shù),是限制某個服務(wù)的并發(fā)數(shù)量,對服務(wù)的并發(fā)數(shù)量設(shè)置一個閾值,超過該閾值則服務(wù)暫停接受新的請求。

2.2 熔斷機制

如果某個目標服務(wù)調(diào)用慢或者有大量超時,如5秒內(nèi)20次調(diào)用失敗,此時,熔斷該服務(wù)的調(diào)用,對于后續(xù)調(diào)用請求,不在繼續(xù)調(diào)用目標服務(wù),直接返回,快速釋放資源。如果目標服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。熔斷機制在Hystrix中,位于隔離技術(shù)之前。

1、判斷是否進行熔斷的依據(jù)是:計算錯誤率,當(dāng)錯誤率超過預(yù)設(shè)的值(默認是50%)且10秒內(nèi)超過20個請求,則開啟熔斷。
2、 對于被熔斷的請求,并不是永久被切斷,而是被暫停一段時間之后,允許部分請求通過,若請求都是健康的,則對請求健康恢復(fù)(取消熔斷),如果不是健康的,則繼續(xù)熔斷。

2.3 總執(zhí)行流程

image.png
  1. 首先判斷是否有緩存,如果有則直接返回結(jié)果
  2. 無緩存,則判斷斷路器是否打開,如果打開則執(zhí)行回退方法,返回結(jié)果
  3. 熔斷器未打開,則判斷線程池/信號量是否到底閾值,如果到達閾值,則執(zhí)行回退方法,返回結(jié)果
  4. 若未達到閾值,則執(zhí)行命令,如果成功返回結(jié)果;失敗返回回退方法的執(zhí)行結(jié)果

參考:
[1] Hystrix GitHub官網(wǎng):https://github.com/Netflix/Hystrix/wiki
[2] 楊恩雄-2017《瘋狂Spring Cloud微服務(wù)架構(gòu)實戰(zhàn)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (git上的源碼:https://gitee.com/rain7564/spring_microservices_...
    sprainkle閱讀 9,540評論 13 33
  • 原文:https://my.oschina.net/7001/blog/1619842 摘要: Hystrix是N...
    laosijikaichele閱讀 4,444評論 0 25
  • 流程圖 下圖展示了當(dāng)你使用 Hystrix 來包裝你請求依賴服務(wù)時的流程: 接下來將詳細介紹如下問題: 1.構(gòu)建H...
    KingsChan閱讀 6,380評論 0 21
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • assert 是C里面的宏。用于斷言。 NSAssert 類似于NSLog(),方便易用。但她只能在Objecti...
    _Lily閱讀 2,643評論 1 2

友情鏈接更多精彩內(nèi)容