IM服務器的架構

轉自:http://blog.csdn.net/m372897500/article/details/49159237


一、 總的構架結構示意圖:
如上圖所示,目前系統總的分成六個模塊,分別爲網絡/協議解析模塊,用戶帳號管理模塊,消息處理模塊,動作處理模塊,數據均衡處理模塊,客戶狀態處理模塊
正常流程應該這麼實現,以一個或者幾個線程運行網絡/協議解析模塊,然後他根據具體的包類型分發給具體的命令處理模塊,每個具體的命令處理模塊至少應該分別運行於不同的線程。
從上面的結構圖可以看出,其中客戶狀態模塊和網絡/協議解析模塊都是公用模塊,其他的模塊幾乎都依賴於這兩個模塊。目前因爲很多功能不予以實現,例如不實現離線消息,所以只有用戶帳號管理模塊跟數據庫相關。

二、 每個模塊的具體功能描述 
1. 用戶帳號管理模塊: 
該模塊管理基於用戶帳號的所有操作:具體由如下:創建用戶,刪除用戶,修改用戶資料,修改用戶密碼,得到用戶個人信息,得到好友列表,登陸,登出,請求認證串,創建羣組,加入羣組,離開羣組。
以上所有操作,除了創建用戶不需要登陸外,其他的任何操作都必須是已經登陸的用戶,所以必須先有登陸操作,才能進行下一步的操作,這條規則針對所有的命令都是。
描述一下登陸過程: 
客戶端發送命令請求得到認證串——〉網絡/協議解析模塊把客戶端請求以及它的用戶標誌轉發給用戶帳號管理模塊——〉用戶帳號管理模塊自動生成一個隨機認證串,同時把該客戶端的用戶標誌一起保存在列表中(在列表中該數據只能保存一分鐘,超過則刪除,因此客戶端必須在一分鐘內利用此認證串登陸),同時把認證串由網絡/協議解析模塊發送給客戶端——〉客戶端把用戶名和認證串、用戶名、密碼組成的新串的MD5一併發給服務器請求登陸——〉網絡/協議解析模塊把客戶端請求以及它的用戶標誌轉發給用戶帳號管理模塊——〉用戶帳號管理模塊首先檢查列表中是否有該用戶標誌的數據,如果有則繼續——〉從數據庫中取出用戶名和密碼,然後從列表中取出認證串,生成MD5,看是否一致,如果一致,則表示登陸成功,服務器生成會話加密密鑰,以後的所有與服務器的會話信息都採用此密鑰加密和解密——〉網絡/協議解析模塊把結果發送給客戶端,如果成功——〉網絡/協議解析模塊把該用戶的用戶標誌和會話加密密鑰保存在客戶狀態模塊中。

2. 網絡/協議解析模塊: 
網絡解析模塊應該保存一個最近的登陸用戶列表的緩存,該列表保存的信息應該有IP和端口,還有加密密鑰,最後一次訪問的時間。在該列表的用戶,如果超過一定時間(例如一分鐘)沒有訪問,就要從該列表中刪除。該列表的主要用途用於快速的查找登陸用戶(這樣頻繁訪問服務器的用戶登錄檢查就不需要叢客戶狀態模塊中查詢了,提高效率),如果在此列表中查找不到,則向客戶狀態模塊查找,如果找到了,則把用戶添加到此列表中。如果找不到,則表示不在線。
任何時候收到用戶的消息,則要更新登陸用戶列表的緩存中的最後訪問時間數據,如果該用戶不在列表中,但是最後檢查已經登陸,則要添加。還有心跳命令不應該影響該列表的用戶數據。但是心跳命令會影響客戶狀態列表。
網絡解析模塊應該保存一個用戶標誌映射列表(也可以直接組合他們的數據地址),把客戶端的IP地址和端口映射到一個具體的唯一客戶端標誌值,然後這個值以後作爲這個客戶端的標誌,各個具體模塊對客戶端的任何操作都以這個標誌爲基礎。
有四個功能 
第一,根據不同的類型把數據報解密後(如果需要解密)分發給各個具體的處理模塊。在分發前,首先檢查該用戶是否登陸,如果沒有,則直接告訴客戶端一個錯誤。對於新建用戶,登陸命令,獲取認證字符串的命令不需要檢查是否已經登陸。
第二,自己處理相關的消息,目前自己處理的消息包括心跳消息和客戶端請求建立直連的命令,還有任何數據包的格式不對或者版本不對的情況處理,則該模塊自己就處理了。 
第三,把用戶發送消息時的狀態提交給客戶狀態模塊,其中包括用戶唯一標誌。如果用戶在發送消息時,地址已經修改了,那麼唯一標誌必須保持不變,但是用戶標誌列表中的用戶地址數據必須跟着修改。
第四,包各個模塊發送給客戶端的消息加密後(如果需要)處理髮送給客戶端。

3. 客戶狀態模塊: 
該模塊的功能如下: 
第一、 保存並操作所有當前在線的用戶信息,包括用戶的登陸時間,用戶標誌,用戶狀態(隱身等),用戶帳號。提供給其他模塊查詢某個用戶是否登陸。 
第二、 處理獲取在線好友的消息,如果收到此命令,則通過用戶帳號管理模塊查找該用的好友列表,同時查找當前的在線用戶列表,然後就得到在線好友列表。 
第三、 處理用戶狀態改變的命令,如果收到用戶的狀態改變消息(如登錄、登出、隱身等),則查找該用戶的在線好友列表,然後一一通知。 
第四、 如果長時間沒有收到用戶的消息,則認爲該用戶因爲意外的原因而斷線,則自動認爲登出。客戶端在沒有任何消息需要發送時,會定時的向服務器發送心跳命令,告訴服務器客戶端在線,如果連續一段時間沒有收到心跳信息,則認爲用戶已經斷線。
第五、 保存並操作在線羣組信息。給其他模塊提供獲取特定羣組或者場景中的用戶列表功能。

4. 消息處理模塊: 
處理所有的消息轉發,包括羣消息,好友消息。 
對於好友消息,該消息處理模塊首先通過客戶狀態模塊檢查好友是否在線,如果在線,則把好友消息發送過去,如果不在線,則不發送。 
對於羣消息,如果是針對普通的羣組消息,則通過客戶狀態模塊得到該羣組的在線用戶列表,然後給每個人發送該消息,除了自己。 
如果是場景中的公有消息,則先檢查該用戶所在場景的位置,然後計算出能夠聽到該用戶的場景中的其他用戶的用戶列表,然後給每個人發送消息。計算的算法參考每個場景用戶的座標,其中在特定場景中的用戶不參與運算,除非在同一個的特定場景中的用戶才參與運算。
注意:對於場景消息,如果客戶端不是以場景方式登錄的,那麼就不能發送和接收場景消息。
除了以上的消息,還有廣告消息,系統消息之外客戶端可以接受外,陌生人不能互發消息,如果服務器接受到此列消息,必須忽略,不發送任何應答。

5. 動作處理模塊: 
處理所有場景動作,該消息只有場景用戶方式登錄的才能發送和接收動作命令。服務器接收用戶的動作命令,計算出用戶所在的場景中能夠看到的人的列表,然後一一發送命令給該用戶。計算的算法參考每個場景用戶的座標,其中在特定場景中的用戶不參與運算,除非在同一個的特定場景中的用戶才參與運算。
該模塊中保存有一個用戶的位置和動作狀態表(包括是否在某個特定的場景裏面信息),保存場景用戶的所在場景用戶的座標和最後一次的動作狀態信息。
場景用戶登錄後,位置每更新一次,都必須把該用戶所在的場景位置座標發送給服務器,對於心跳信息和動作信息不需要攜帶位置座標數據。

6. 數據均衡處理模塊: 
該模塊主要爲了分佈式處理,服務器負載平衡而設計,主要發出網絡服務器重定向的命令,對於這些命令,所有客戶端都必須處理,因爲一旦服務器發出了這個命令後,就在此服務器不再保存該用戶信息了。
目前該模塊不實現。 

http://blog.csdn.net/sanfengshou/article/details/5664223


發佈了7 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章