第一个架构模型在
这里按照里面评论者的意见,我做了一些修改,见图.
![](http://www.cppblog.com/images/cppblog_com/converse/7557/o_IM%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9E%B6%E6%9E%84%E5%9B%BE2.jpg)
做了几处修改:
1) 暴露在外部与客户端直接相连的服务器有登录服务器, 资料服务器, 消息服务器, 在线状态服务器,增加了一个session服务器, 不直接面向客户端.客户端在登录的时候,验证密码之类的合法性检查通过之后, 登录服务器将向session服务器申请一个新的sessionid, 以后客户端与这些服务器进行通信的时候协议包都需要带上这个sessionid以验证协议包是否合法.
在这里, 登录服务器做的事情简化为验证登录用户合法性, 返回为登录用户申请的sessionid, 以及登出用户同时通知session服务器注销该用户的sessionid.
2)消息服务器与在线状态服务器保持连接,客户端发送消息的时候, 首先消息服务器要去查询用户是否在线, 如果不在线就存入为离线消息.
3)在线状态服务器与客户端每隔一段时间都要发送心跳包保持连接.注意这里由客户端主动发送, 而不是服务器发送, 这样某种程度上可以避免在线服务器宕机带来的影响.
4)这几个暴露在外面的服务器只是简单的对外接口, 底下可能还有很多内部使用的服务器, 请见第一篇架构的说明, 当用户量上来时, 还需要考虑扩容的问题.
如果还有不妥的地方,请继续讨论,谢谢指教.