1. 程式人生 > >後端技能樹修煉:基於佇列的流量削峰模式

後端技能樹修煉:基於佇列的流量削峰模式

在分散式架構中,前端一個請求會經過後端的多個服務的處理才返回結果,這時就可能會存在一種情況,在間歇性高負載情況下,某個服務 B 的處理能力不能滿足負載的需求,從而導致服務 B 崩潰或者服務呼叫者 A 響應超時,如下圖所示:

那麼如何解決這種問題呢?有讀者可能會說,那就給服務 B 作單機效能優化,從而提升單機處理能力,進而提升服務 B 叢集的整體處理能力;或者當單機處理能力已經無法進一步優化或者即使優化後仍然無法滿足負載需求時,那麼就對服務 B 叢集進行水平擴容,從而提升叢集整體的處理能力。

沒錯,這是一種常見的解決方案,但如果服務 B 叢集擴容成本很高呢?例如服務 B 需要用到 GPU 來跑 AI 模型,而我們知道 GPU 成本不低。有一種解決方案是通過引入訊息佇列(例如 Kafka,RabbitMQ 等)來作為緩衝區,從而最小化請求峰值對服務可用性和響應性的影響(當然,也要考慮具體業務場景是否適合使用這種方式),如下圖所示:

引入訊息佇列後,原來的同步呼叫變為非同步執行,服務 A 將原來的請求封裝成訊息,傳送到訊息佇列中,而服務 B 則根據自己的處理節奏從訊息佇列中獲取訊息進行處理,訊息佇列起到緩衝區的作用。這樣即使服務 A 叢集對服務 B 叢集發起大量的併發請求,也不會導致服務 B 叢集處理不過來甚至崩潰。

當然這種模式也適用於程序內的流量削峰,我們只需把上面的服務 A 和服務 B 替換成同一個應用程序內的模組間呼叫,而訊息佇列則替換成程序內的佇列實現方案(例如 Disruptor)即可,模式是活的,具體如何應用就看使用者的水平了

對Java技術,架構技術感興趣的同學,歡迎加QQ群:863621962,一起學習,相互討論。