伺服器推送技術常用的三個解決方案

jimcloudlisa發表於2020-09-28

暫不表第三方的雲服務如何如何。在自建IM服務上,每家公司的選擇往往逃不出下面的三個方案:一是普通的http解決方案:app端通用http服務定時拉取訊息,比例每隔3秒,雖然你和我可能都很鄙視這個方案,但確實有公司在用。二是基於comet的解決方案(其實也是基於http):app端透過comet服務拉取訊息,即app端發起一次http請求,然後服務端檢查有無待接收的訊息,如果有立即返回給app端,如果無,則把當前http請示掛起多少多少秒,如30秒,在這30秒內,如果他人給當前的app使用者傳送訊息,服務端能在這30秒任意一點立即結束當前掛起的http請求,並把訊息一起返回給app端。此方案我熟悉的有icomet服務。三是socket解決方案:app端透過socket與服務端通訊,目前比較常用的服務端socket解決方案有nodejs,swoole,workerman等等。一般遊戲類app服務端和app端採用此方案的比較多。在耗電量和耗流量上第一個是最耗電的,第二個次之,第三個是最優,但透過下面的設計方案,第二個方案和第三個在耗電量和耗流量上差別不大:主要理由是考慮到使用者線上的時長及socket也要維持一套心跳服務上來推論。前提條件:伺服器端先維護一自增的訊息id服務,不管是點聊訊息和群聊訊息,自增id不要用同一套(主要是基於兩者的訊息量上來考慮),但所有使用者的點聊都用同一套自增的針點聊的訊息id服務,所有使用者的群聊訊息都用同一套自增的針群聊的訊息id服務。這樣每傳送的每一條訊息都有一個唯一的id。注意:點聊訊息和群聊訊息都只儲存一條,哪怕一個群內有2000個群成員,在資料庫中儲存的也只有一條訊息記錄。ASLINE的伺服器提供全國最先進、快速網路設計及國際頂級裝置 。免備案、速度快,受到國內站長的歡迎。為各類使用者提供優質伺服器,五星級式售後免費重灌系統,重啟,系統測試app端直接請求icomet服務(注意:app不是直接請求php或java或nodejs或其它服務),每個app端使用者分配一個專用的icomet通道接收訊息和提供長連線服務,由icomet服務來負責維持與app端的長連線。然後用php或java或其它語言負責往傳送訊息,還是以我熟悉的php為例,當php端接收到傳送訊息請求時,在處理完相關業務邏輯後,往訊息接收方的icomet通道中推送訊息(包括訊息唯一id和具體訊息內容等),這樣如果app端使用者線上的話,且還維持著icomet的長連線的話,就能立即接收到訊息。app端接收到訊息後處理完成後再發起下次長連線請求(注意:app端接收到訊息後沒有回撥告訴伺服器端已接收到,沒有回撥,沒有回撥!重要的事說三遍!)。或許會有這樣的需求:要支援檢視歷史訊息的功能,即使是換終端裝置了,也要能支援檢視歷史訊息。此時該如何進一步最佳化?很簡單:由於訊息id都是自增的,只需要另開一個http訊息查詢介面,按訊息id的大小往前或往後查詢即可app端呼叫php寫的介面實現發訊息功能,php負責處理相關業務邏輯,並把訊息寫入mongodb和rabbitmq佇列中寫,然後由java與app端做的一套socket服務消費rabbitmq佇列,來實現通知app端再呼叫php的訊息查詢介面去拉取訊息。單臺伺服器不可避免的問題首先,要明白單臺伺服器常見的問題,無非就是併發、大資料、單點併發問題:一個時間點,同時有海量使用者去對伺服器進行訪問大資料:例如海量資料的儲存和傳輸(效能方面的問題)單點問題:例如只有一臺伺服器,如果伺服器出現故障了後果不堪設想。針對以上問題,出現了以下幾種解決方式(後面我這個部落格會持續更新,目前我就瞭解兩種):叢集架構思想:可以處理併發問題和單點問題,叢集的目標是多臺伺服器做相同的業務處理,可以緩解使用者的併發問題(也叫作負載均衡),同時因為多臺伺服器做相同的操作,所以一臺掛了並不影響另一臺的操作,所以可以避免單點問題。(以前使用apache做分散式叢集負載均衡的前端伺服器,現在流行Ngix做分散式叢集負載均衡的前端伺服器)。舉個例子,叢集就像大家用的膝上型電腦和外接鍵盤的關係,筆記本的鍵盤壞了,可以用外接鍵盤,提供持續服務,或者筆記本鍵盤沒壞,用外接鍵盤可以更好的保護筆記本鍵盤不會加速衰老叢集的種類:高可用叢集:主要是為了保障使用者的應用程式持久、不簡單提供服務負載均衡叢集:可以做到把一個高負荷的應用分散到多個節點共同完成,適合業務繁忙、大負荷訪問的系統科學計算叢集(HPC叢集):提供單個計算機不能提供的強大計算能力,追求與綜合效能分散式架構思想:和叢集的實現不同,叢集是多臺伺服器集中實現同一種業務,而分散式則是把多臺伺服器集中在一起,每臺伺服器實現不同的業務,做不同的事情,並且缺一不可,如果一臺伺服器掛了,就有可能影響整個伺服器的功能的執行。分散式叢集綜合架構思想:就如上面所述,叢集有叢集的好處,分散式有分散式的好處,可否做到兩個架構進行合併呢,當然可以。我們可以讓分散式的每一個節點都進行叢集,這種架構通常叫做分散式叢集架構。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982974/viewspace-2724858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章