利用socket.io建立消息推送系統(tǒng)

簡介

由于最近接觸了socket.io方面的知識宝磨,了解到作為基于websocket進行封裝的socket.io疮绷,但是又不是完全基于websocket翰舌。在消息接受發(fā)送方面有很強的實時性,這個特性對于消息推送場景是很契合的冬骚,于是打算從這方面入手椅贱。


方案一

為了實現(xiàn)相互之間的解耦,以下分為幾個角色只冻,分別為主業(yè)務服務器(Server)庇麦、Socket.io通道管理服務器(Socket.io)、用戶(client)喜德。


方案1.png

首先山橄,是通過客戶端,就是client住诸,發(fā)送HTTP請求到Server上驾胆,比如說用戶輸入了用戶名和密碼,發(fā)送到服務端(Server)去進行驗證贱呐,驗證通過之后丧诺,Server發(fā)送成功的消息到socket.io處,將與client端的通信打開奄薇,實現(xiàn)消息的實時推送功能驳阎。但是在實現(xiàn)過程中的問題在于,由于要經(jīng)過http請求才能打開通信通道,在http方法里定義socket呵晚,此時消息從client到達Server速度很快蜘腌,但是在從sokcet.io到client的時候,速度變得很慢饵隙,原因目前未知撮珠,方案在原理上是說得通的,只是具體實現(xiàn)有困難金矛。
首先需要說明的是芯急,這個方案利用JWT(Json Web Token),客戶端先通過Server進行用戶名與密碼的驗證驶俊,通過之后娶耍,會給客戶端返回一個經(jīng)過加密的token,也就是jwt饼酿。之后榕酒,用戶訪問Server的一個url,其中需要bearToken才能進行訪問故俐,訪問之后想鹰,在其路由里定義相關動作,將成功訪問的消息發(fā)送至Socket.io處购披,將連接建立起來杖挣,此時的連接指的是socket.io和client之間的websocket連接


方案二

這個方案具體是通過socket.io中的命名空間來實現(xiàn)對于各個用戶的指定連接肩榕,利用第三方包socketio-auth來進行相關賬戶連接的認證刚陡,如果認證通過,則連接成功株汉,否則筐乳,失敗。但是由于這個方案socketio這部分和主業(yè)務服務器耦合度太高,無法實現(xiàn)socketio的重復利用。
具體情況是弧烤,在socket.io和client之間的連接已經(jīng)建立窘俺,但是沒有emit任何信息。socketio-auth里面具體的配置情況如下

socketioAuth(socket,{
    authenticate: authenticate,
    postAuthenticate: postAuthenticate,
    timeout: 1500
})

首先先經(jīng)過authenticate磨确,如果驗證成功之后,再進入下一步,即postAuthenticate身隐,之后將驗證成功的用戶添加到socket.client.user中去,建立相關連接唯灵。如果驗證不成功贾铝,直接執(zhí)行disconnect來終止連接。
總而言之,整個流程走下來垢揩,先是在client和socketio處建立連接玖绿,但是這個連接沒有保障性,沒有發(fā)送任何信息叁巨。之后驗證成功之后斑匪,再通過用戶名建立一個更加私密的連接,也就是通過用戶名來創(chuàng)建namespace來建立連接锋勺,之后的消息發(fā)送以及監(jiān)聽走的均是這個私密的連接秤标。


方案三

為了達到解耦目的,以及免除方案一的繁瑣方案宙刘,目前的方案三的大致圖如下


image.png

首先苍姜,這里假設用戶是已經(jīng)經(jīng)過驗證過的用戶,用戶首先與Socket.io建立連接悬包,這個連接是客戶端連接到Socket.io的主域名上衙猪,連接之后,Client發(fā)送一個登陸消息布近,將自身的信息發(fā)送給Socket.io去保存垫释,目前只是簡單的在socket.io建立一個空的數(shù)組來保存這些信息,實際工程上應該保存在數(shù)據(jù)庫上撑瞧。連接成功之后棵譬。再進行下一步,即比如用戶觸發(fā)一個按鈕预伺,比如說點擊了購買的按鈕订咸,然后Server端通過這個按鈕綁定的事件,獲取點擊按鈕的用戶(Client)信息酬诀,將獲取到的tokenId以及點擊之后需要向用戶推送的信息脏嚷,經(jīng)過包裝之后,通過POST方式將信息發(fā)送至Socket.io服務端瞒御。之后父叙,Socket.io通過獲取到的具體tokenId。然后和保存的tokenId進行對比肴裙,如果有存在與之匹配的趾唱,就建立一對一映射關系的連接,將信息推送到客戶端(Client)蜻懦。
這樣一來甜癞,就能很好的將主要業(yè)務服務器Server和Socket.io分離開來,Socket.io就可以給不同的服務器之間共用阻肩。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末带欢,一起剝皮案震驚了整個濱河市运授,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乔煞,老刑警劉巖吁朦,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渡贾,居然都是意外死亡逗宜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門空骚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纺讲,“玉大人,你說我怎么就攤上這事囤屹“旧酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵肋坚,是天一觀的道長乡括。 經(jīng)常有香客問我,道長智厌,這世上最難降的妖魔是什么诲泌? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮铣鹏,結(jié)果婚禮上敷扫,老公的妹妹穿的比我還像新娘。我一直安慰自己诚卸,他們只是感情好葵第,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惨险,像睡著了一般羹幸。 火紅的嫁衣襯著肌膚如雪脊髓。 梳的紋絲不亂的頭發(fā)上辫愉,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音将硝,去河邊找鬼恭朗。 笑死,一個胖子當著我的面吹牛依疼,可吹牛的內(nèi)容都是我干的痰腮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼律罢,長吁一口氣:“原來是場噩夢啊……” “哼膀值!你這毒婦竟也來了棍丐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沧踏,失蹤者是張志新(化名)和其女友劉穎歌逢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘狱,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秘案,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潦匈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱高。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茬缩,靈堂內(nèi)的尸體忽然破棺而出赤惊,到底是詐尸還是另有隱情,我是刑警寧澤凰锡,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布荐捻,位于F島的核電站,受9級特大地震影響寡夹,放射性物質(zhì)發(fā)生泄漏处面。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一菩掏、第九天 我趴在偏房一處隱蔽的房頂上張望魂角。 院中可真熱鬧,春花似錦智绸、人聲如沸野揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斯稳。三九已至,卻和暖如春迹恐,著一層夾襖步出監(jiān)牢的瞬間挣惰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工殴边, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憎茂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓锤岸,卻偏偏與公主長得像竖幔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子是偷,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拳氢,服務發(fā)現(xiàn)募逞,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 大綱 一.Socket簡介 二.BSD Socket編程準備 1.地址 2.端口 3.網(wǎng)絡字節(jié)序 4.半相關與全相...
    VD2012閱讀 2,342評論 0 5
  • 作者:詹聰聰 序言: 本人工作中需要用到flask-socketio馋评,在學習英文文檔時發(fā)現(xiàn)凡辱,flask-socke...
    Python中文社區(qū)閱讀 12,651評論 6 39
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)栗恩、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)透乾、lso...
    北辰青閱讀 9,423評論 0 11
  • 為什么很討厭那個女人呢?因為她強勢霸道磕秤? 好像不僅僅是乳乌,一個領導者,就是她口中所謂的leader是需要具備讓人信服...
    咿呀學步的樹懶閱讀 116評論 0 0