SNA架構的幾種實現方式

2021-09-08 00:02:49 字數 1469 閱讀 7452

參考資料:

shared nothing architecture與php的童話

shared nothing architecture

以往集群架構都採用session共享模式進行設計,而後php等方面提出了sna架構,主張session不共享。sna架構思想,無論對企業應用還是大型互聯**,極大提高了web應用的吞吐量和效能。

一般sna架構以整合分布式cache例如 memcached 的方案居多,此處姑且稱為 cache模式。

我結合公司電信專案的情況,以及思考,總結另一種方案,供參考。

sna思想的關鍵就是每個集群內web server例項不互相共享session,cache模式主張session資料都放到分布式快取中,意味著,邏輯上集群內還是要共享session信 息;這種考慮源於負載均衡時,同乙個ip發來的兩個請求,可能走到不同的 web server上。

因此,只要同一ip的兩個請求**到同乙個 web  server例項,那麼就可以不需要全域性的 session資訊快取。

1) 我所在的移動專案下,採用 f5硬體負載均衡器,使用ip記憶機制實現了這一點。因此,各 web server例項的session無需共享,仍然儲存在自己的session記憶體中,節省了網路開銷和cache命中查詢時間。

f5很貴,因此對於**一般負擔不起,但可以採用軟體負載來做到這一點。

切分模式的sna架構:

2) ip memory(ip記憶):負載伺服器記錄 客戶端ip -> serverid 的關係,模擬f5;

3) (dispatch by rule)按規則**:ip記憶需要維護一張路由table, 因此,需要消耗一定記憶體,以及對映關係查詢的時間;

我們將客戶端的所有ip看作乙個集合 ip set,按固定規則將其平均分配集群的server例項上去,這樣就可以節省路由table的開銷。 關鍵是分配演算法,可以考慮的有:

2.1) 簡單數值法: ip各節加總 = x, 假定集群例項個數為 n,編號1-n, 那麼每次請求選擇的目標server id = x mod n。

2.2) hash值法: 有的系統可能想基於 userid 進行請求分配, 那麼可以採用 x = hashcode(userid), serverid = x mod n;

具體情況下, 可以靈活選擇使用那個資料項判斷請求分配的邏輯。這個思想參考了  memcached 的集群管理思想。

4) stickysession方式。

一般apache等採用這種方式做負載均衡。但必須結合 jvmroute。 第一次被分配的 web server必須返回乙個 jvmroute在response中,並由 apache 送到客戶端瀏覽器,第二次請求發起時,request資訊中將包含 jsessionid 和 對應的 jvmroute, apache根據次找到對應的 server,完成 stickysession機制。

結論: 切分模式的sna架構,基於規則進行請求**,可以省去分布式cache的使用,更進一步的提公升系統吞吐量和響應性。

居中的幾種實現方式

如果需要居中的是內聯元素的話,給父級元素加上text align center即可。如果是塊級元素,那就給自身加上margin 0 auto,上下的margin為0,左右auto就會自動居中。如果多個塊級元素放到一行並居中,你可以使用display inling block把他們變成內聯元素,然後再...

spring aop 的幾種實現方式

博主只用過或者了解過三種用法 1.其於 實現 2.原生的切面 3.aspectj註解驅動的切面 個人感覺第一種用起來比較簡單。也比較好理解,主要有以下的配置檔案 這樣就可以簡單的完成乙個aop 的實現 了 第二種 是基於在原始的標籤在配置的aop 就是注入到spring容器中了 網上的另一中寫法 a...

幾種MAPE的實現方式

這種方式是為了防止label裡面有nan值,但沒考慮是否為零值。這裡以pytorch進行舉例。def masked mape preds,labels,null val np.nan if np.isnan null val mask torch.isnan labels else mask lab...