1. 程式人生 > >漫話:如何給女朋友解釋為什麼雙11當天不能申請退款

漫話:如何給女朋友解釋為什麼雙11當天不能申請退款

雙十一當天晚上的十一點多,我下班回到家中,看到平時很早就睡覺的女朋友今天竟然還沒有睡覺。於是我問她:


服務降級:當伺服器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放伺服器資源以保證核心交易正常運作或高效運作。

服務降級

服務降級的概念聽起來可能不是很容易理解,舉一個生活中的例子就很好理解了。

有的時候我們去飯店吃飯,吃完飯以後服務員會拿一張問卷,讓就餐者填寫一下使用者反饋。但是,這種讓使用者填寫反饋的請求,只有在店裡不忙的時候才會出現。如果店裡非常忙,顧客很多的話,店員就不會再找就餐者填寫問卷了。

其實,這種就是服務降級。在人流量大的時候,使用者反饋這個功能就被降級了。因為他相對來說並沒有那麼重要。

接著再來看分散式系統的降級。

 上圖是一張淘寶商品的詳情頁,對於很多剁手黨來說這個頁面真的是再熟悉不過了。

但是,這個頁面我粗略的大致數了一下,至少有15個以上的功能模組,如:圖片、標題、定價、庫存、推薦、評價、物流、收藏、下單等。

雖然這些功能都展示在同一個頁面上,但是其實這些功能並不都是在同一個應用裡面的。這十幾個模組可能分別在十幾個應用中實現的。

詳情頁在渲染的時候,要和十幾個應用進行網路互動。

這些功能中,有一些是非常重要的,比如:定價、庫存、下單等。還有一些是相對來說沒那麼重要的,比如:推薦、收藏等。

這個識別哪些功能是核心功能、哪些功能是非核心功能,然後對非核心功能採取不通的降級方案制定的過程叫做降級預案

雙十一當天,整個網站的流量十分巨大的,詳情頁的訪問量更是整個網站的重災之地。所以,一旦有大促的時候,需要有限保證主要功能的可用,至於那些次要的功能就可以被降級掉,即不顯示某些模組,或者返回一些預設內容。

降級的方式

還拿之前的飯店中給使用者做問卷調查的例子來說。當人流量大的時候,直接取消問卷調查只是一種方式。還有很多其他方式可以選擇的。比如:

1、先讓使用者填寫一下手機號,然後離店後,給使用者發簡訊,讓其填寫電子問卷。

2、在店門口放一個問卷,使用者離店時自己去填寫問卷。 等等,只要願意想,其實是有很多種方案的。

同樣,對於大型網站來說,服務的降級其實也是有很多方式可以選的,常見的幾種如下:

延遲服務

比如發表了評論,重要服務,比如在文章中顯示正常,但是延遲給使用者增加積分,只是放到一個快取中,等服務平穩之後再執行。

在粒度範圍內關閉服務(片段降級或服務功能降級

比如關閉相關文章的推薦,直接關閉推薦區

頁面非同步請求降級

比如商品詳情頁上有推薦資訊/配送至等非同步載入的請求,如果這些資訊響應慢或者後端服務有問題,可以進行降級; 頁面跳轉(頁面降級)

比如可以有相關文章推薦,但是更多的頁面則直接跳轉到某一個地址。

寫降級

比如秒殺搶購,我們可以只進行Cache的更新,然後非同步同步扣減庫存到DB,保證最終一致性即可,此時可以將DB降級為Cache。

讀降級

比如多級快取模式,如果後端服務有問題,可以降級為只讀快取,這種方式適用於對讀一致性要求不高的場景;

降級的介入方式

按照是不是可以自動化降級,降級共有兩種介入方式,分別是:自動開關降級人工開關降級

自動開關降級

自動開關降級的方式一般是當系統達到某些設定的條件(系統負載、資源使用情況、SLA等指標)之後,自動執行一些策略。

常見的可以作為自動降級條件的指標有以下幾個:

服務超時

當訪問的資料庫/http服務/遠端呼叫響應慢或者長時間響應慢,且該服務不是核心服務的話可以在超時後自動降級;

比如前面提到的詳情頁上有推薦和收藏功能,即使出現問題也不會影響使用者的正常下單。如果是呼叫別人的遠端服務,和對方定義一個服務響應最大時間,如果超時了則可以自動降級。

失敗次數

呼叫外部服務的時候,除了超時意外,最常見的異常情況就是呼叫失敗。比如詳情頁中的庫存資訊,如果是某一次查詢請求失敗了,那麼可以那麼就可以通過讀取快取資料等方式直接降級掉。

但是,這種降級可能存在一個問題,就是雖然一次請求展示了快取,但是其他使用者訪問的時候還是會查詢庫存資訊,這對於庫存系統來說就是雪上加霜。因為他可能已經有問題了,但是上游系統還是在不斷的對他傳送請求。

所以,可以針對這個查詢庫存的介面做統一的降級。設定一個失敗次數的閾值,一旦整體失敗次數達到這個閾值了,就對後續一段時間內的改查詢介面做降級。直到其功能恢復。

發生故障

上面提到的失敗可能是服務不穩定造成的,過一段時間可以自動恢復的。還有一種情況可能是依賴的服務徹底跪了、或者網路不通了等等。這種情況就可以直接降級了。

當HTTP請求返回固定的錯誤碼、或者一個RPC請求的時候底層服務拋了異常以後,就認為有故障發生,對其進行降級即可。

限流降級

還有種電商網站常見的策略,那就是限流降級。對於某些功能,設定一個流量閾值,一旦流量達到閾值的話,就進行降級。

比如秒殺功能,如果一瞬間流量太大,就可以進行限流降級。對於後續訪問的使用者直接提示已售空、跳轉錯誤頁、或者讓他輸入驗證碼重試等。

人工開關降級

還有一種降級方式,那就是人工開關降級。

人工開關降級的方式是指當系統維護人員在發現系統異常之後,通過人工修改引數、關閉服務等方式進行降級的方法。

這種方式的好處是比較靈活,能夠根據異常情況靈活應對;但弊端是對人的要求比較高,一來需要維護人員對系統有足夠的瞭解,另外要求維護人員在系統異常時能夠在第一時間進行處置。

還有一種情況,可能也會人工介入,那就是在大促之前,預估到流量會十分巨大,提早的識別出風險,為了節省資源保證主流程的可用,開發人員可以手動將某個功能降級掉。

這裡說的人工開關降級,並不一定是一定要人工操作,也可能是人工通過一個定時任務進行定時觸發的。

降級工具

目前市面上,針對流量控制,限流降級主要有以下兩種選擇:Netflix Hystrix 和 Alibaba Sentinal。

Hystrix


Hystrix是一個庫,它提供了服務與服務之間的容錯功能,主要體現在延遲容錯和容錯,從而做到控制分散式系統中的聯動故障。Hystrix通過隔離服務的訪問點,阻止聯動故障,並提供故障的解決方案,從而提高了這個分散式系統的彈性。

Hystrix 的關注點在於以 隔離 和 熔斷 為主的容錯機制,超時或被熔斷的呼叫將會快速失敗,並可以提供 fallback 機制。

Sentinel


Sentinel 是阿里中介軟體團隊開源的,面向分散式服務架構的輕量級高可用流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助使用者保護服務的穩定性。

Sentinel 的側重點在於:多樣化的流量控制、熔斷降級、系統負載保護、實時監控和控制檯等

對比

 上圖是Sentinel的文件中,關於Sentinel-與-Hystrix-的對比。