參考資料:
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...