分布式系統常用技術棧掃盲

2021-08-16 10:24:40 字數 2433 閱讀 9683

nginx, rpc, zookeeper, 訊息中介軟體(jms, activemq,rabbitmq,rocketmq), nosql(redis, mongodb)

分布式由來:

國內來講,移動網際網路的爆發伴隨著分布式系統的突現,移動網際網路最大的特點是2(to)c的o2o產品越來越多,這跟傳統2b的系統最大區別就是使用者量的不同,2c系統的使用者量遠遠要高於2b系統,這就對系統提出了各種各樣的高標準,響應時間,效能,災備,吞吐量等等,各種分布式技術也是為了這些標準而服務。

技術掃盲

1. 分布式和集群

分布式和集群在通常情況下不做嚴格區分,正如同併發和並行一樣,應用情況下很少會去考究它的區別,許多大公司面試也直接問分布式集群怎樣怎樣,一般都拿等同來講了。在這裡只在概念上做一下區別,使大家更合理的去理解,沒有對錯之分。

分布式:乙個電商系統,使用者模組部署在server1, 訂單模組部署在server2, **模組部署在server3, 商品模組部署在server4,他們之間通過遠端rpc實現服務呼叫,這就叫分布式。強調的是不同功能模組,單獨部署在不同的server上,所有server加起來是乙個完整的系統。

集群:更多強調的是災備,乙個電商系統,完整的部署在server1上乙個,完成的部署在server2上乙個,server1宕機後,server2仍然可以正常提供請求服務,這叫集群。同樣對於某一功能模組,比如使用者模組部署在server1上,同樣部署在server2上,也叫做集群。分布式系統的每個功能模組節點,都可以用多機做成集群。

抽象問題具體化:拿做菜示例,假如乙個廚師做菜要經歷切菜,炒菜兩個功能,飯店為了提高速度招了兩個廚師,每個廚師的工作一樣,都是切菜,炒菜,這是集群。還有另一種方法提高效率,飯店招了乙個切菜師傅,配合廚師,廚師不管切菜,只管炒菜了,和切菜師傅共同配合把菜做好,這叫分布式。

2. nginx

作用是反向**和負載均衡。

反向**是指請求真實是到server1的,但是系統中為了統一或者做比如單點登入,會在server2伺服器上安裝乙個nginx,裡面配置到server1的反向**,那麼之後請求url就可以寫server2的位址,發出後到server2, server2會**到server1上,類似一種**的模式。

負載均衡是指如果乙個系統的請求很多,我們可以把請求**到不同的伺服器上,用來分流。就類似於接了乙個水管放水,水流量很大時候,水壓大很可能會讓乙個水管**,這時候接三個水管,就沒問題了(這三個水管就是乙個集群)。類似的在nginx伺服器中配了3個tomcat伺服器,每個tomcat伺服器上都部署了整個系統,那麼當請求數大的時候,可以分發到不同的tomcat。(其實這裡每個tomcat上部署同乙個功能模組也叫集群)

3. rpc(遠端過程呼叫)

對於分布式系統來講,tomcat1上部署了使用者模組,tomcat2上部署了訂單模組,當使用者下單時,請求到tomcat2,這時候可能要判斷這個使用者是否是vip,或者是否有優惠券,這些方法是在tomcat1使用者模組上的,那麼tomcat2呼叫tomcat1的服務獲取這些資訊,就叫rpc呼叫。

rpc呼叫底層涉及到物件的序列化,反序列化,http/tcp傳輸,網路非同步傳輸netty。

4. 訊息中介軟體

mq訊息中介軟體在分布式系統中的作用有很多,但是經常用到的還是非同步解耦。

比如天貓下單流程,當使用者支付後,後台介面執行的操作可能包括:1 驗籤,2 支付密碼校驗,3 扣庫存,4 使用者積分增加等等操作,其實我們希望的是2操作執行成功後立即給使用者結果提示,而不是等到後續各個操作完成後才去提示,因為後續的操作往往大部分是rpc呼叫,方法執行時間相對較長。另外對於下單支付這個操作,3和4是後續業務的需要,在設計上不能和下單支付本身出現強耦合度。所以這裡我們可以引入mq解決,也就是說1和2執行完成後,生產者只需要通知下3和4,把後續的操作扔給訊息佇列,立即返回。這裡的mq起到的作用乙個是非同步呼叫,乙個是解耦。

5. nosql

nosql是所有非關係型資料庫的統稱,在分布式系統中用到很多,主要用來提高qps(query per second)。

redis: 我們講快取,或者記憶體資料庫,小巧強大,什麼資料適合放在redis也就是快取中,乙個是經常查詢的,需要頻繁磁碟io的,例如有個快件系統,有個需求是當快件狀態為異常時候,需要傳送郵件提醒給系統管理員。介面入參是快件id,通常做法我們需要拿到id,去資料庫查狀態,然後傳送,但是快件基數很大時候每天的問題件也可能會很多,介面呼叫頻繁時候就需要改進做法,這時我們可以把快件狀態資訊放在redis裡面,key是快件id, value是快進狀態,每次進入介面時候直接redis裡面取status就可以,速度很快。另乙個是查詢資料緩慢的,可以放在快取中。

mongodb: 可稱為分布式檔案資料庫,可用來儲存海量資料,它是nosql裡面最像關係型資料庫的,它的資料的儲存形式可以就理解為json格式。之前曾經兩次用到過mongodb,一次是系統裡面有個實時監控裝置電流電壓的功能,硬體裝置實時會把資料同步到資料庫裡面,我們系統2-3s需要去拉次列表。另乙個系統是乙個輕型的行業im工具,每天會有很大的聊天資料儲存,我們直接用了mongodb儲存,後來系統相當穩定,從來沒有出現過效能瓶頸。

分布式技術

資料分布式模式 利用多台計算機並行處理多個請求,在相同的時間內完成更多的請求,解決單機效率瓶頸問題。多集群出現的問題如下 資源 乙個系統提供正常能力需要占用的硬體資源 可用性和可擴充套件性 不同分布式系統的指標 選舉流程 優點 演算法複雜度低,選舉快,簡單易實現 缺點 每個節點需要儲存全域性節點訊息...

分布式鎖 常用技術方案

1 是否可以考慮採用reentrantlock來實現,但是實際上去實現的時候是有問題的,reentrantlock的lock和unlock要求必須是在同一執行緒進行,而分布式應用中,lock和unlock是兩次不相關的請求,因此肯定不是同一執行緒,因此導致無法使用reentrantlock。2 基於...

分布式系統與Java技術

很多人在問為什麼使用ejb時,得到的答案大多是ejb容器提供了對enterprise bean安全管理和事物管理,便於開發人員關注於業務上的開發,而不用把過多的時間浪費在處理和業務無關的工作上 個人不認為這種說法是全面的,因為如果將spring和ejb作比較的話,spring也提供了良好的安全管理和...