淺談大規模高并發服務的伸縮問題

什么是大規模高并發?

大規模高并發是兩個詞,前者表示有大量的流量訪問,后者表示競爭狀態下并發可能會遇到的一致性和可用性問題。

 

有什么問題?

如果只是大規模的流量,我們可以簡單的進行負載均衡和針對架構層面的優化就能解決,這一塊和業務并無直接聯系。

但是高并發就不一樣了,就算只有不太多的流量,只要存在并發競爭關系,必然會牽扯到狀態的一致性和業務流程的拆分優化。

最重要的是狀態,由于狀態需要被維護,因此針對狀態的伸縮擴展一直以來很容易跟技術發生混淆,我們必須要明確的一點就是,如果狀態競爭在業務層面沒有得到有效的解決,在技術層面目前也是無法得到有效的解決的。

可以想象,無狀態的服務很容易得到拓展,只需要增加處理節點,均勻的負載流量,路由到指定的節點處理即可。

所以關鍵在于業務要如何拆分?狀態要如何維護?這是下面將要講到的。

 

如何解決?

大規模低并發

這種是最容易解決的,只需要增加處理節點即可,因為不需要牽扯到狀態的維護,因此也無須擔心會發生副作用。

一般來講,HTTP請求將會被均勻的路由給不同的節點進行處理,我們可以做到無限拓展,只需要在適當的條件下進行伸縮即可。

因為不存在狀態的維護,因此和業務關系不大,只需要在技術層面進行優化。

 

大規模高并發

有時間的可以讀一下我之前寫的這篇文章(http://www.hvkoxm.live/xingxueliao/p/11561263.html

我這里所提到的并發,可能跟很多人的理解有所不同,并發這個詞實際上指的是邏輯上的,什么是邏輯上的?那就是和底層細節隔離開,我們只需要在腦海中存在這么一個概念。

無論我們使用多線程,多進程,還是在不同主機上面運行的程序,在不同的時間進行并行處理,高并發在本文的重點側重于對狀態的變更所導致的一致性問題和可用性問題。

就像java的并發包里面,更多的是一些工具用于維護狀態,為了使狀態在并發條件下預期可控制,所以我也使用并發一詞來表達這種競爭場景。

看起來似乎是矛盾的,一致性和可用性是兩個極端,我們只能在這兩個點之間進行選擇,平衡兩點對應業務的影響。

如果我們想要高可用,那么業務流程可能就會更復雜,因為時間關系,我們只能選擇最終一致,那么必然就存在中間狀態和流程。

如果我們想要強一致,那么只需要簡單的按照順序處理完整個業務流程即可,但是可用性就無法發揮到最佳的程度。

在產品初期,為了快速的實現原型設想,又要保證結果是可預期的,可靠的,直接使用支持ACID的數據庫是最方便省事的。

過渡到產品后期,取決于業務數據的維度和聚合主體,狀態隔離分區和業務流程優化是必不可少的。

簡而言之,高可用帶來了更大的復雜性,而強一致又會導致可用性不足。

在上面的連接的文章之中我也簡略的講了一些“解決辦法”,其實倒不如說是一些思考方式,能夠讓我們清醒的認識到,哪些東西才是我們需要去關注和解決的。

posted @ 2019-10-09 12:07 XingxueLiao 閱讀(...) 評論(...) 編輯 收藏
七乐彩2011年走势图南方双彩