一步一步開始作。html
附錄:前端
一套開源協議:http://www.igniterealtime.org/index.jsp算法
Proso:http://prosody.im/數據庫
那誰網友的筆記http://www.cppblog.com/converse/archive/2009/01/13/71902.html緩存
網友的一些觀點:服務器
msn是用幾個不一樣的服務器分別運行的不一樣的服務。
還有是服務器羣集的技術,我也不是很瞭解。高手補充下。網絡
定時發送其實很簡單,將待發送數據排程便可。好比,用戶但願「
出隊過程就是,將消息按發送時間前後排序,將全部「時間到」
具體架構偶也不是很清晰,不過建議使用RPC中間件。
難點有下面兩點:負載均衡
1.用戶上下線消息的處理。
不一樣的用戶分佈式策略決定了用戶上下線消息的處理。
2.DB的分佈式策略
在同時在線 10萬用戶的系統裏面單數據庫顯然沒法知足需求,
分佈式的數據庫策略或者大量的memory cache是個解決方案。
我之前作過一段時間電信,我以爲IM和移動的原理差很少,
關於DB分佈,能夠考慮引入兩個概念,一個叫歸屬位置寄存器,
歸屬位置寄存器存放用戶的原始資料信息,包括用戶名和密碼。
我以爲應當包含如下幾部分:
一、好友列表、狀態維護服務器,
二、登陸及會話分發服務器,用於用戶登陸系統,
三、聊天服務器,用戶與該服務器直接鏈接進行,
四、聊天消息中轉服務器,對於不一樣的聊天服務器間消息的分發,
大概的流程:
一、用戶登陸,登陸及會話服務器驗證登陸並生成會話,
二、客戶端拿到會話令牌和分配獲得的聊天服務器的信息,
三、若是對聊天消息不作檢查的話,直接走P2P的流程進行聊天,
四、對於離線消息直接存儲到內存隊列或者文本DB中,
五、對聊天服務器作分配,
我的以爲若是P2P應用得好和好友列表及狀態維護上也實現得好,
以上純屬我的猜測。你們繼續!
好友狀態能夠用簡單的Ping Pong機制來肯定,另外,我有想將服務器的所謂「中轉網絡」
我以爲不必定像移動網那麼複雜,也不必定徹底照搬。
粗略劃分了一下:
對於HLR(歸屬寄存器),保存賬號的基本信息;
最後一次登錄時的服務器等少許的動態信息。
對於VLR(拜訪寄存器),
(不在線)用戶發的消息)
呃……對了……有大量的基於Jabber的開源服務器能夠參考。
若是要現成的,
也許能夠看看 ejabberd - Distributed, fault-tolerant Jabber/XMPP server
written in Erlang
http://www.process-one.net/en/
ICE提供的功能也足夠實現分佈式IM了
im 最大的難點,就是一個定位 和查找的問題。
而最致命的問題,是不少賬戶可能不用
歸屬位置寄存器存放用戶的原始資料信息,包括用戶名和密碼。
這種作法可能會有很是大的浪費。 可是設計合理仍是能夠用的。
定位和查找,偶們常用的樹形結構就頗有用。
對於遊戲im來講還要考慮一帳戶多腳色多點同登問題。
IM 架構的考慮,是總體性的考慮,
是什麼規模的集羣,樓主能夠先考慮一下。
由於大規模和小規模差異太大了。