im系統種類:
1. 單聊:已讀未讀,端到端加密,離線訊息,
2. 群聊:
大群(萬人群),記錄乙份聊天記錄。
小群 (200人以下群,使用者體驗不同,功能更多,可以在小群內做已讀未讀訊息,隱私訊息),
小群 已讀未讀,使用mongodb記錄狀態。msgid,user_11110001:1
3. 聊天室:沒有離線訊息的概念。使用者可以隨機加入和退出聊天室。(已讀未讀,端到端加密,離線訊息)這些都沒有。
4. channel超大群:群成員數量沒有上限,客戶端訂閱某個channel。但channel的總個數不應該太多。
im服務心得:
1. 服務之間呼叫不應該有同步阻塞式io操作
2. 訊息在鏈路的任何乙個環節,為了保證訊息可靠性,都要有ack和重發機制。
3. 為了避免多執行緒操作同乙份資料,需要加鎖導致等待的問題。在程序內部對thread的分配也根據sessionid進行sharding
考慮的問題:
1. 安全性
2. 可靠性,不丟訊息,訊息不重複。
3. 高效能,高併發
群聊伺服器
# 聊天室與group的區別
1. 聊天室:可以隨時加入或退出。退出聊天室之後,無需推送訊息。
群:成員不會隨時退出,可以在同一時間接收多個群的訊息。
2. 聊天室:沒有離線訊息的概念
群:使用者離線,下次上線後需要能接收未讀的訊息。
## accessserver
1. 負責跟客戶端建立連線。集群,不同的使用者socket隨機連線到不同的接入伺服器。
2. 將客戶端連線資訊上報給userrouterserver。 定時上報。推
3. 接受客戶端訊息: 生成msg_id: 自增,redis , 返回:已傳送ack
4. **給groupserver或p2pserver
5. 將來自userrouterserver的訊息**給客戶端
6. 同乙個uid可以有多個客戶端連線
## p2pserver
1. 接收來自accessserver的訊息
2. 將訊息**給 userrouterserver。
## 資料庫表:
1. 使用者會話列表
sessions: uid, session_id, session_type, session_name;
2. 使用者好友表:
friends: uid1, uid2 限制:(uid1
## redis
1. session_last_msg: (session_id, msg_id, message_content....)
2. user_last_read: (session_id , msg_id )
## q/a
1. - q:載入會話列表過程
- a: 查詢sessions表,查詢session_last_msg(redis), 查詢user_last_read(redis)
2. - q: 載入會話列表的未讀數如何得到?
- a: 通過redis中的session_last_msg和user_last_read中的msg_id的差值計算。
3. - q: p2p訊息ack狀態
— a: 傳送中,已傳送,已接收,已讀。
4. - q: group訊息ack狀態
— a: 傳送中,已傳送
5. - q: 何時更新user_last_read?
- a:前端讀取訊息時,都要傳送已讀ack,只不過group訊息無需更新訊息狀態。
6. - q:載入好友列表過程
- a:依次查詢 friends -> user_info -> friend_memo
7. - q:傳送p2p訊息時,使用者離線。
- a:不做處理。只寫入p2p_message表即可。
8. - q:傳送group訊息時,使用者離線。
- a:不做處理。只寫入group_message表即可。
13. - q: 群訊息接收順序的錯亂
- a: 無論是group訊息還是p2p訊息,都不會發生錯亂。
因為訊息路由的一致性:保證訊息的順序不會發生錯亂。
傳送方:同乙個group 都會到達同乙個 groupserver
接收方:同乙個group 的訊息,都來自同乙個groupserver , userrouter, accessserver
14.
1. 聊天室
2. 一對一單聊
3. 小群:
已讀未讀狀態,訊息可以加密。
寫複製,寫擴散。訊息佇列。
4. 大群:沒有已讀狀態,服務端儲存聊天記錄。
沒有寫複製,直接在資料庫中集中儲存乙份聊天記錄。
不保證訊息到達的可靠性。通過定時檢查訊息最後一條記錄來保重不丟訊息
服務端是否儲存聊天記錄:
1. 儲存聊天記錄, 不加密
2. 不儲存聊天記錄,訊息加密。
15 。 可靠性(訊息不重複,不丟失),
及時性: 訊息無延時, 網路層面,
安全性: 使用者之間端到端加密, 伺服器與客戶端之間的端到端加密。
16
q: 為什麼p2p訊息需要經過p2pserver,而不是直接由access傳送到userroutera:因為p2pserver具有p2psessionid的概念,同乙個p2p會話傳送的訊息鏈路是一樣的。
js websocket聊天伺服器
js websocket 目錄 下面展示了如何通過websocket傳送訊息給伺服器端 input.onchange function input.value socket.onmessage function e script body html 此websocket伺服器來自於 通過websoc...
C 聊天程式伺服器
使用系統 引用 丟 引用 使用system.windows.forms 使用的system.data 使用system.net 使用system.net.sockets 使用的system.threading 命名空間的chatserver 公升 summarygt 清理所有正在使用的資源。摘要 保...
Linux SSH伺服器架構
1.ssh伺服器簡介 隨著網路應用的不斷普及,網路傳輸的資訊會越來越多,在保證資訊傳輸的同時,安全性也相當的重要。為了保證可靠的資料傳輸,一般都採用加密技術,而採用ssh進行加密,然後進行資料傳輸,這樣,資訊的安全性就得到了極大的提高。ssh是 secure shell安全外殼協議 ssh協議有兩個...