服務端工做:前端
1. 文件上傳模塊FileServer。有狀態的,會有本地緩存。mysql
線程分片處理。同一個資源的請求,一定分配到同一個線程中,避免了線程的加鎖。
Java實現Promise的實現。對於RocksDB本地緩存沒有此文件的狀況,若是有多個請求同時到達,加入到Pending等到隊列中,只有第一個請求引發的操做纔會去請求數據庫。算法
使用mysql存儲文件索引。用來標記每一個文件存儲在哪臺mongoDb服務器上。sql
本身實現的RpcClient。 基於長連接,記錄ReqId,超時機制。數據庫
2. 文件上傳模塊FileGate。無狀態的,客戶端能夠任意鏈接api
上傳過程:
經過FileGate對上傳請求作分片路由到FileServer中。保證同一個文件到多個分片可以落盤在同一個FileServer中。
考慮到用戶可能取消文件發送到狀況。因此不能直接將文件分片直接傳入文件服務器。緩存
下載過程:
由於FileServer會有本地RocksDB緩存,因此經過FileGate路由,能夠提升緩存命中率。服務器
3. Spring Cloud系統的搭建架構
客戶端H5頁面請求。客戶端打開H5頁面時候,在URL上拼接jwtToken。頁面會將它寫到本身本地的Cookie中。同時,對於有權限的請求,爲了防止CSRF攻擊,後續的Ajax請求,須要攜帶CsrfTokenui
使用zuul實現restapi gate 攔截全部請求,解開jwtToken,還原成用戶信息。
使用長鏈接JwtToken生產者。JwtToken使用非對稱加密。使用私鑰簽名,公鑰驗證簽名。JwtToken中不存儲敏感數據,只明文存儲UID信息。
使用eurake實現服務的註冊和發現。
4. 服務端架構
Access -- 隨機鏈接上來。Netty qps 5000
Session -- (uid,access_server_id,connection_id) 使用UID作分片,一致性哈希算法
P2PChatServer -- 使用from_uid,to_uid作分片。
OffMsgServer -- 離線消息服務。
GroupServer -- 使用group_id作分片。
HistoryMsgServer -- 歷史消息服務器 。存儲到MySQL
FileGate -- 隨機鏈接上來。
FileServer -- 使用 storage_file_id 或 client_file_id 作分片
消息發送前,客戶端生成一個client_msg_id . 發送到服務器後,服務端返回一個 storage_msg_id
前端工做:
WebIM
WebSocket,Protobuf,React,Redux,高階組件,DH密鑰交換算法,
emoji 表情庫 , 文本輸入框contentEditable, 頭像編輯框。
ECC 加密算法