一步一步开始作。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 架构的考虑,是总体性的考虑,
是什么规模的集群,楼主能够先考虑一下。
由于大规模和小规模差异太大了。