浅谈个人对IM服务端设计与实现的一点理解
窗口会有一个连接,通过这个连接的每个请求会通过logic转发到后面的各个功能模块,功能模块返回应答或者确认包之后如何找到对应的socket将数据发送到客户端呢?我使用哈希桶管理所有的连接,通过uid将连接挂到不同的哈希桶中,如果哈希函数设计合适,操作效率应该还不错
后面的功能模块中,目前已有较清晰计划的是login和route模块 login负责用户的登录验证,获取好友列表,已经上线状态的通知;验证完成后会向各个在线好友推送当前状态(在线、忙碌、离开……),这里要用到route模块
说说route模块,它是连接各个功能模块的枢纽,消息转发,状态推送都会用到它;顾名思义,它起着路由的功能 在消息转发中,如果两个用户被分配到同一个logic机器上,当然可以容易的找到目的好友所建立的socket描述符,然后发送数据,若不在同一logic上,就需要用到route模块,route可以视为一个内存数据库,它维持了所有在线用户的一些基本信息,包括状态,所在的logic,消息传到route后,route知道该将消息转发到哪个logic机器,到达目标logic后,根据目的uid哈希到正确的hash桶然后找到正确的socket描述符发送数据; 状态推送中,如上上所诉,一个用户登录或者状态更改,可获取所有在线好友列表(route有记录),然后,route找到对应的在线好友所在的logic,发送状态变更通知包,好友即可感知你的状态变更 route还有个功能,当发送消息的时候好友不在线,经过route判断不在线,则会将消息存到离线消息数据库中;当用户下次登录时,将离线消息推送到用户
route和各个logic模块、数据库维持长连接
文件传输,需要NAT穿透,A发起请求向B传输文件,请求发送到服务器,服务器判断B是否在线,如果在线,根据连接管理中的信息,得出B的IP和端口通知给A,然后像B发送通知,告知A想发起文件传输请求,B确认后,AB才能进行文件传输,之后可以不经过中央服务器,使用P2P对等通信进行文件传输
未完待续………… 本文出自 “流离and逍遥” 博客,请务必保留此出处http://liulixiaoyao.blog.51cto.com/1361095/693845 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |