版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 海量在線用戶即時(shí)通訊系統(tǒng)設(shè)計(jì)目 錄 TOC o 1-3 h z u HYPERLINK l _Toc526839503 1.服務(wù)端設(shè)計(jì) PAGEREF _Toc526839503 h 3 HYPERLINK l _Toc526839504 1.1.總體架構(gòu) PAGEREF _Toc526839504 h 3 HYPERLINK l _Toc526839505 1.2.邏輯結(jié)構(gòu) PAGEREF _Toc526839505 h 4 HYPERLINK l _Toc526839506 2.協(xié)議設(shè)計(jì) PAGEREF _Toc526839506 h 15 HYPERLINK l _Toc5268395
2、07 2.1.TCP數(shù)據(jù)協(xié)議 PAGEREF _Toc526839507 h 15 HYPERLINK l _Toc526839508 2.2.TCP消息體設(shè)計(jì) PAGEREF _Toc526839508 h 15 HYPERLINK l _Toc526839509 3.存儲(chǔ)設(shè)計(jì) PAGEREF _Toc526839509 h 20 HYPERLINK l _Toc526839510 3.1.MySQL數(shù)據(jù)庫 PAGEREF _Toc526839510 h 20 HYPERLINK l _Toc526839511 3.2.Redis緩存 PAGEREF _Toc526839511 h 21 H
3、YPERLINK l _Toc526839512 3.3.文件及圖片存儲(chǔ) PAGEREF _Toc526839512 h 22 HYPERLINK l _Toc526839513 3.4.數(shù)據(jù)歸檔 PAGEREF _Toc526839513 h 22服務(wù)端設(shè)計(jì)總體架構(gòu)總體架構(gòu)包括5個(gè)層級(jí),具體內(nèi)容如下圖。1.1.1 用戶端移動(dòng)端重點(diǎn)是移動(dòng)端,支持IOS/Android系統(tǒng),包括IM App,嵌入消息功能的瓜子App,未來還可能接入客服系統(tǒng)。1.1.2 用戶端API針對(duì)TCP協(xié)議,提供IOS/Android開發(fā)SDK。對(duì)于H5頁面,提供WebSocket接口1.1.3 接入層接入層主要任務(wù)是保持
4、海量用戶連接(接入)、攻擊防護(hù)、將海量連接整流成少量TCP連接與邏輯層通訊。1.1.4 邏輯層邏輯層負(fù)責(zé)IM系統(tǒng)各項(xiàng)功能的核心邏輯實(shí)現(xiàn)。包括單聊(c2c)、上報(bào)(c2s)、推送(s2c)、群聊(c2g)、離線消息、登錄授權(quán)、組織機(jī)構(gòu)樹等等內(nèi)容。1.1.5 存儲(chǔ)層存儲(chǔ)層負(fù)責(zé)緩存或存儲(chǔ)IM系統(tǒng)相關(guān)數(shù)據(jù),主要包括用戶狀態(tài)及路由(緩存),消息數(shù)據(jù)(MySQL也可采用NoSql,如MangoDB),文件數(shù)據(jù)(文件服務(wù)器)。 邏輯結(jié)構(gòu)1.2.1 核心結(jié)構(gòu)核心結(jié)構(gòu)部分描述IM系統(tǒng)核心組件及其關(guān)系。結(jié)構(gòu)圖如下??蛻舳藦腎plist服務(wù)獲取接入層IP地址(也可采用域名的方式解析得到接入層IP地址),建立與接入層
5、的連接(可能為短連接),從而實(shí)現(xiàn)客戶端與IM服務(wù)器的數(shù)據(jù)交互;業(yè)務(wù)線服務(wù)器可以通過服務(wù)器端API建立與IM服務(wù)器的聯(lián)系,向客戶端推送消息;客戶端上報(bào)到業(yè)務(wù)服務(wù)器的消息,IM服務(wù)器會(huì)通過mq投遞給業(yè)務(wù)服務(wù)器。1.2.2 tcp接入核心流程1.2.2.1 登錄授權(quán)(auth)1、客戶端通過統(tǒng)一登錄系統(tǒng)實(shí)現(xiàn)登錄,得到token。2、客戶端用uid和token向msg-gate發(fā)起授權(quán)驗(yàn)證請(qǐng)求。3、msg-gate同步調(diào)用msg-logic的驗(yàn)證接口4、msg-logic請(qǐng)求sso系統(tǒng)驗(yàn)證token合法性5、msg-gate得到登錄結(jié)果后,設(shè)置session狀態(tài),并向客戶端返回授權(quán)結(jié)果。1.2.2.2
6、 登出(logout)1、客戶端發(fā)起logout請(qǐng)求,msg-gate設(shè)置對(duì)應(yīng)Peer為未登錄狀態(tài)。2、Msg-gate給客戶端一個(gè)ack響應(yīng)。3、Msg-gate通知msg-logic用戶登出。1.2.2.3踢人(kickout)用戶請(qǐng)求授權(quán)時(shí),可能在另一個(gè)設(shè)備(同類型設(shè)備)開著軟件處于登錄狀態(tài)。這種情況需要系統(tǒng)將那個(gè)設(shè)備踢下線。1-5步,參看Auth流程。6、Logic檢索Redis,查看是否該用戶在其他地方登錄。7、如果在其他地方登錄,發(fā)起kickout命令。(如果沒有登錄,整個(gè)流程結(jié)束)8、Gate向用戶發(fā)起kickout請(qǐng)求,并在短時(shí)間內(nèi)(確??蛻舳耸盏絢ickout數(shù)據(jù))關(guān)閉soc
7、ket連接。1.2.2.4 上報(bào)(c2s)1、客戶端向gate發(fā)送數(shù)據(jù)2、Gate回一個(gè)ack包,向客戶端確認(rèn)已經(jīng)收到數(shù)據(jù)3、Gate將數(shù)據(jù)包傳遞給logic4、Logic根據(jù)數(shù)據(jù)投遞目的地,選擇對(duì)應(yīng)的mq隊(duì)列進(jìn)行投遞5、業(yè)務(wù)服務(wù)器得到數(shù)據(jù)1.2.2.5推送(s2c)1、業(yè)務(wù)線調(diào)用push數(shù)據(jù)接口sendMsg2、Logic向redis檢索目標(biāo)用戶狀態(tài)。如果目標(biāo)用戶不在線,丟棄數(shù)據(jù)(未來可根據(jù)業(yè)務(wù)場景定制化邏輯);如果用戶在線,查詢到用戶連接的接入層gate3、Logic向用戶所在的gate發(fā)送數(shù)據(jù)4、Gate向用戶推送數(shù)據(jù)。(如果用戶不在線,通知logic用戶不在線)5、客戶端收到數(shù)據(jù)后向g
8、ate發(fā)送ack反饋6、Gate將ack信息傳遞給logic層,用于其他可能的邏輯處理(如日志,確認(rèn)送達(dá)等)1.2.2.6單對(duì)單聊天(c2c)1、App1向gate1發(fā)送信息(信息最終要發(fā)給App2)2、Gate1將信息投遞給logic3、Logic收到信息后,將信息進(jìn)行存儲(chǔ)4、存儲(chǔ)成功后,logic向gate1發(fā)送ack5、Gate1將ack信息發(fā)給App16、Logic檢索redis,查找App2狀態(tài)。如果App2未登錄,流程結(jié)束7、如果App2登錄到了gate2,logic將消息發(fā)往gate28、Gate2將消息發(fā)給App2(如果發(fā)現(xiàn)App2不在線,丟棄消息即可,這種概率極低,后續(xù)離線消
9、息可保證消息不丟)9、App2向gate2發(fā)送ack10、Gate2將ack信息發(fā)給logic11、Logic將消息狀態(tài)設(shè)置為已送達(dá)。注:在第6步和第7步之間,啟動(dòng)計(jì)時(shí)器(DelayedQueue或哈希環(huán),時(shí)間如5秒),計(jì)時(shí)器時(shí)間到后,探測該條消息狀態(tài),如果消息未送達(dá),考慮通過APNS、米推、個(gè)推進(jìn)行推送1.2.2.7 群聊(c2g)采用擴(kuò)散寫(而非擴(kuò)散讀)的方式。群聊是多人社交的基本訴求,一個(gè)群友在群內(nèi)發(fā)了一條消息:(1)在線的群友能第一時(shí)間收到消息(2)離線的群友能在登陸后收到消息由于“消息風(fēng)暴擴(kuò)散系數(shù)”的存在,群消息的復(fù)雜度要遠(yuǎn)高于單對(duì)單消息。群基礎(chǔ)表:用來描述一個(gè)群的基本信息im_gr
10、oup_msgs(group_id, group_name,create_user, owner, announcement, create_time)群成員表:用來描述一個(gè)群里有多少成員im_group_users(group_id, user_id)用戶接收消息表:用來描述一個(gè)用戶的所有收到群消息(與單對(duì)單消息表是同一個(gè)表)im_message_recieve(msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, deliverd, cmd_id)用戶發(fā)送消息表:用來描述一個(gè)用戶發(fā)送了哪些消息
11、im_message_send (msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, cmd_id)業(yè)務(wù)場景舉例:(1)一個(gè)群中有x,A,B,C,D共5個(gè)成員,成員x發(fā)了一個(gè)消息(2)成員A與B在線,期望實(shí)時(shí)收到消息(3)成員C與D離線,期望未來拉取到離線消息群聊流程如下圖所示1、X向gate發(fā)送信息(信息最終要發(fā)給這個(gè)群,A、B在線)2、Gate將消息發(fā)給logic3、存儲(chǔ)消息到im_message_send表,按照msg_from水平分庫4、回ack5、回ack6、Logic檢索數(shù)據(jù)庫(需要
12、使用緩存),獲得群成員列表7、存儲(chǔ)每個(gè)用戶的消息數(shù)據(jù)(用戶視圖),按照msg_to水平分庫(并發(fā)、批量寫入)。8、查詢用戶在線狀態(tài)及位置9、Logic向gate投遞消息10、Gate向用戶投遞消息11、App返回收到消息的ack信息12、Gate向logic傳遞ack信息13、向緩存(Hash)中更新收到ack的時(shí)間。然后在通過一個(gè)定時(shí)任務(wù),每隔一定時(shí)間,將數(shù)據(jù)更新到數(shù)據(jù)庫(注意只需要寫入時(shí)間段內(nèi)有變化的數(shù)據(jù))。1.2.2.8拉取離線消息下圖中,將gate和logic合并為im-server。拉取離線消息流程如下。1、App端登錄成功后(或業(yè)務(wù)觸發(fā)拉取離線消息),向IM系統(tǒng)發(fā)起拉離線消息請(qǐng)求。
13、傳遞3個(gè)主要參數(shù),uid表明用戶;msgid表明當(dāng)前收到的最大消息id(如果沒收到過消息,或拿不到最大消息id則msgid=0)即可;size表示每次拉取條數(shù)(這個(gè)值也可以由服務(wù)器端控制)。2、假設(shè)msgid=0,什么都不做。(參看第6步驟)3、Im-server查詢用戶前10條離線消息4、將離線消息推給用戶。假設(shè)這10條離線消息最大msgid=110。5、App得到數(shù)據(jù),判斷得到的數(shù)據(jù)不為空(表明可能沒有拉完離線數(shù)據(jù),不用10條做判斷拉完條件,因?yàn)榉?wù)端需要下下次拉離線的請(qǐng)求來確定這次數(shù)據(jù)已送達(dá)),繼續(xù)發(fā)起拉取操作。Msgid=110(取得到的離線消息中最大的msgid)。6、Im-serv
14、er刪除該用戶msgid110的錢10條離線數(shù)據(jù)。8、返回給AppN-1、查詢msgid140的離線數(shù)據(jù),0條(沒有離線數(shù)據(jù)了)。N 、將數(shù)據(jù)返回App,App判斷拉取到0條數(shù)據(jù),結(jié)束離線拉取過程。1.2.3 PUSHISO采用APNS;Android真后臺(tái)?;?,同時(shí)增加米推、個(gè)推。基本思路:push提示信息,App通過拉離線獲得真實(shí)消息。另附文檔說明此問題。協(xié)議設(shè)計(jì)TCP數(shù)據(jù)協(xié)議TCP的數(shù)據(jù)協(xié)議如下圖所示。包括header和body兩部分。消息頭總共20個(gè)字節(jié),具體信息如下表。TCP消息體設(shè)計(jì)消息體協(xié)議采用ProtocolBuffer(谷歌)協(xié)議,版本3.0.0,該協(xié)議在序列化效率、壓縮、可
15、擴(kuò)展方面都具有優(yōu)勢。協(xié)議條目見附錄11.1.1TCP協(xié)議命令清單。以下為主要流程涉及的協(xié)議2.2.1 認(rèn)證(auth)2.2.2登出(logout)2.2.3 踢人(kickout)2.2.4 心跳(keepalive,noop)心跳包消息體為空。2.2.5單對(duì)單聊天(c2c)2.2.6群聊(c2g)2.2.7拉離線(pull)2.2.8控制類(ctrl)存儲(chǔ)設(shè)計(jì)MySQL數(shù)據(jù)庫MySQL數(shù)據(jù)庫采用utf8mb4編碼格式(emoji字符問題)3.1.1主要表結(jié)構(gòu)3.1.1.1發(fā)送消息表保存某個(gè)用戶發(fā)送了哪些消息,用于復(fù)現(xiàn)用戶聊天場景(消息漫游功能需要)。3.1.1.2推送消息表保存某個(gè)用戶收到了哪些消息3.1.1.3群相關(guān)表群基本信息表群用戶關(guān)系表3.1.2 水平分庫Redis緩存3.2.1用戶狀態(tài)及路由信息Redis緩存以u(píng)id為key,檢索channel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025太原市尖草坪社區(qū)招(選)聘(128人)備考題庫附答案
- 人造板飾面工班組安全測試考核試卷含答案
- 碳排放交易員保密能力考核試卷含答案
- 橡膠割膠工安全生產(chǎn)意識(shí)強(qiáng)化考核試卷含答案
- 粗液脫硅工安全防護(hù)競賽考核試卷含答案
- 燈具裝配工崗前基礎(chǔ)培訓(xùn)考核試卷含答案
- 架子工創(chuàng)新應(yīng)用評(píng)優(yōu)考核試卷含答案
- 2024年海南政法職業(yè)學(xué)院輔導(dǎo)員招聘備考題庫附答案
- 2025年事業(yè)單位必考題《公共基礎(chǔ)知識(shí)》題庫學(xué)生專用
- 2024年邵陽學(xué)院輔導(dǎo)員考試筆試題庫附答案
- 【一例擴(kuò)張型心肌病合并心力衰竭患者的個(gè)案護(hù)理】5400字【論文】
- 四川橋梁工程系梁專項(xiàng)施工方案
- 貴州省納雍縣水東鄉(xiāng)水東鉬鎳礦采礦權(quán)評(píng)估報(bào)告
- GC/T 1201-2022國家物資儲(chǔ)備通用術(shù)語
- GB.T19418-2003鋼的弧焊接頭 缺陷質(zhì)量分級(jí)指南
- 污水管網(wǎng)監(jiān)理規(guī)劃
- GB/T 35273-2020信息安全技術(shù)個(gè)人信息安全規(guī)范
- 2023年杭州臨平環(huán)境科技有限公司招聘筆試題庫及答案解析
- 《看圖猜成語》課件
- LF爐機(jī)械設(shè)備安裝施工方案
- 企業(yè)三級(jí)安全生產(chǎn)標(biāo)準(zhǔn)化評(píng)定表(新版)
評(píng)論
0/150
提交評(píng)論