那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

自己设想的一个IM服务器的架构(续一)

第一个架构模型在这里

按照里面评论者的意见,我做了一些修改,见图.


做了几处修改:
1) 暴露在外部与客户端直接相连的服务器有登录服务器, 资料服务器, 消息服务器, 在线状态服务器,增加了一个session服务器, 不直接面向客户端.客户端在登录的时候,验证密码之类的合法性检查通过之后, 登录服务器将向session服务器申请一个新的sessionid, 以后客户端与这些服务器进行通信的时候协议包都需要带上这个sessionid以验证协议包是否合法.
在这里, 登录服务器做的事情简化为验证登录用户合法性, 返回为登录用户申请的sessionid, 以及登出用户同时通知session服务器注销该用户的sessionid.
2)消息服务器与在线状态服务器保持连接,客户端发送消息的时候, 首先消息服务器要去查询用户是否在线, 如果不在线就存入为离线消息.
3)在线状态服务器与客户端每隔一段时间都要发送心跳包保持连接.注意这里由客户端主动发送, 而不是服务器发送, 这样某种程度上可以避免在线服务器宕机带来的影响.
4)这几个暴露在外面的服务器只是简单的对外接口, 底下可能还有很多内部使用的服务器, 请见第一篇架构的说明, 当用户量上来时, 还需要考虑扩容的问题.

如果还有不妥的地方,请继续讨论,谢谢指教.

posted on 2009-01-14 13:47 那谁 阅读(6561) 评论(7)  编辑 收藏 引用 所属分类: 服务器设计

评论

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

客户端接触太多了


我随便画了个,你看看
2009-01-14 15:10 | LOGOS

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

3)在线状态服务器与客户端每隔一段时间都要发送心跳包保持连接.注意这里由客户端主动发送, 而不是服务器发送, 这样某种程度上可以避免在线服务器宕机带来的影响.


假如网络断了,那服务器如何知道客户端离线了呢?
2009-01-14 21:50 | ll

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

@ll
心跳包的意思就是客户端要定时向服务器发包证明自己还在存活, 如果一段时间没有发包服务器就可以认为客户端离线了.一般心跳包发送的频率是几秒一次.
2009-01-14 22:43 |

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

心跳包要互发的和正常的req->ack一样,也就是说保持稳定的脉冲,我觉得只要在最外面暴露登陆服务器和业务服务器,登陆服务器验证完之后,告诉客户端连接哪个业务服务器之后,这个链接就可以回收了
2009-01-15 09:40 | zuhd

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

不知道你有沒有看過 SIP (RFC 3261), 他的架構跟你構想是一樣的, 他的 MESSAGE method 可以用來做 IM, 你可以用 OpenSER 做 SIP Proxy 跟 SIP Registra (登度伺服器), 及 OpenSER 的 Presence module 來達成在線檢測, MSILO module 可以做 offline messaging.
2009-01-29 01:04 | Nash Tsai

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

有瓶颈制约的,如session服务器
2010-01-02 09:09 | 忘忧三毛

# re: 自己设想的一个IM服务器的架构(续一)  回复  更多评论   

“3)在线状态服务器与客户端每隔一段时间都要发送心跳包保持连接.注意这里由客户端主动发送, 而不是服务器发送, 这样某种程度上可以避免在线服务器宕机带来的影响.

从来没听说有服务端向客户端主动发送心跳包的,客户端的IP不一定是全球唯一的,你的心跳包能发进内网能过NAT防火墙?除非是P2P打洞或者你的IM客户端做自动端口映射,技术上海不一定能实现
2011-08-21 04:15 | 小覃

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理