聊天伺服器架構

2022-01-13 07:03:49 字數 2745 閱讀 9450

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傳送到userrouter

a:因為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協議有兩個...