對(duì)于一個(gè)即時(shí)通信服務(wù)器來(lái)說(shuō),在用戶(hù)量少的時(shí)候,一臺(tái)服務(wù)器就足以提供所有的服務(wù)。而這種架構(gòu)也最簡(jiǎn)單,舉個(gè)例子,用戶(hù)A與用戶(hù)B互為好友,A向B發(fā)消息,服務(wù)器接收到消息時(shí),解析出接收消息的人,直接轉(zhuǎn)發(fā)給B即可??墒钱?dāng)用戶(hù)數(shù)量越來(lái)越多時(shí),一臺(tái)服務(wù)器已經(jīng)無(wú)法所有用戶(hù)的需求,這時(shí)就要進(jìn)行服務(wù)擴(kuò)容,進(jìn)行分布式部署
如圖所示,不同的用戶(hù)可能登錄到不同的服務(wù)器上,那么用戶(hù)A給用戶(hù)B發(fā)消息時(shí),服務(wù)器收到消息,首先判斷B是否也登錄在本服務(wù)器上,如果是,那么直接轉(zhuǎn)發(fā)消息即可。如果B不在本服務(wù)器上,那應(yīng)該往哪里轉(zhuǎn)發(fā)這條消息呢?最簡(jiǎn)單的做法就是向服務(wù)器集群中的其他服務(wù)器廣播這條消息,對(duì)于每個(gè)收到這條消息的服務(wù)器,首先判斷消息的目的用戶(hù)是否登錄在自己身上,如果不是,直接忽略該消息。如果是,那么向目的用戶(hù)轉(zhuǎn)發(fā)該消息。固然,這種暴力粗獷的做法是最簡(jiǎn)單直接的,但是會(huì)產(chǎn)生很多無(wú)效的消息轉(zhuǎn)發(fā),對(duì)于服務(wù)器性能產(chǎn)生很大的影響。曾看過(guò)蘑菇街開(kāi)源的即時(shí)通信軟件Teamtalk的代碼,服務(wù)器就是這種實(shí)現(xiàn)方式。其服務(wù)器架構(gòu)如下:
不同的msg服務(wù)器連接到同一臺(tái)route server上,所有msg服務(wù)器之間的轉(zhuǎn)發(fā)全部通過(guò)route server。這無(wú)疑會(huì)加重route server的負(fù)載。即時(shí)msg server部署的再多,根據(jù)木桶理論,一個(gè)系統(tǒng)的性能是由其最薄弱的環(huán)節(jié)所決定的。所以也注定這樣的架構(gòu),其系統(tǒng)容量也是有限的。那么如何改善這種系統(tǒng)呢,很明顯服務(wù)器之間的消息轉(zhuǎn)發(fā)不能直接全部廣播,而應(yīng)該有一套明確的路由系統(tǒng),即服務(wù)器在轉(zhuǎn)發(fā)消息時(shí),應(yīng)該知道這條消息應(yīng)該轉(zhuǎn)發(fā)到哪一臺(tái)服務(wù)器,這樣就不需要每條消息都在所有服務(wù)器之間廣播了。
那么如何實(shí)現(xiàn)這樣一套路由系統(tǒng)呢?
簡(jiǎn)單的做法是,每個(gè)用戶(hù)上線(xiàn)時(shí),通過(guò)其連接的msg server向其他所有msg server廣播自己的登錄信息,告知其他服務(wù)器自己登錄在哪臺(tái)服務(wù)器上面。這樣當(dāng)某個(gè)用戶(hù)向其好友發(fā)消息時(shí),首先通過(guò)好友id查看其登錄的msg server。如果好友與自己是同一臺(tái)服務(wù)器,那么直接轉(zhuǎn)發(fā)即可;如果不是,服務(wù)器向route server發(fā)送轉(zhuǎn)發(fā)該消息,并且?guī)夏繕?biāo)msg server的id.這樣route server 收到消息后,解析出目標(biāo)的msg server,進(jìn)行一次轉(zhuǎn)發(fā)即可,省去了大量的廣播消息。這種方式雖然解決了廣播消息的問(wèn)題,但是在每臺(tái)msg server上都要保存所有用戶(hù)的路由信息。當(dāng)所有用戶(hù)都登錄時(shí),幾乎就退化成了單點(diǎn)模型,msg server肯定承受不了。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線(xiàn)安全]玩轉(zhuǎn)無(wú)線(xiàn)電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26