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


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框架:輕量級的hessian, 阿里dubbo(當當dubbox),  新浪Motan, apache的Thrift,google的grpc, 百度的brpc, 騰訊的tars。

    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存儲,后來系統相當穩定,從來沒有出現過性能瓶頸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM