一步一步開始做。
附錄:
一套開源協議: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分布,可以考慮引入兩個概念,一個叫歸屬位置寄存器,
歸屬位置寄存器存放用戶的原始資料信息,包括用戶名和密碼。
我覺得應當包含以下幾部分:
1、好友列表、狀態維護服務器,
2、登錄及會話分發服務器,用於用戶登錄系統,
3、聊天服務器,用戶與該服務器直接連接進行,
4、聊天消息中轉服務器,對於不同的聊天服務器間消息的分發,
大概的流程:
1、用戶登錄,登錄及會話服務器驗證登錄並生成會話,
2、客戶端拿到會話令牌和分配得到的聊天服務器的信息,
3、如果對聊天消息不做檢查的話,直接走P2P的流程進行聊天,
4、對於離線消息直接存儲到內存隊列或者文本DB中,
5、對聊天服務器做分配,
個人覺得如果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 架構的考慮,是整體性的考慮,
是什么規模的集群,樓主可以先考慮一下。
因為大規模和小規模差別太大了。