基于浏览器的即时通信系统架构设计
不懂就问QQ: 507143199
设计背景需求,某医院要求开发一套医疗辅助系统(2010年)
功能需求模块
医生在线答疑模块。
医疗报告通知模块。
生产环境
客户端:PC机,windows xp操作系统,IE6浏览器
服务端:三台(x86)服务器,内存24G, 硬盘空间2T,内部网络千兆口, 有固定外网IP.
开发环境
开发平台:Linux(ubuntu 14.1), windows xp
编程语言:Linux C++, JavaScript
前端框架:Extjs
开发工具:VIM
详细设计
在线答疑和报告通知模块可以用即时通信的方式来解决。首了解一下即时通信的原理,就是两个客户端点对点实时交换信息,没有时延,发送完成后立即得到回应知道对方已经收到此信息。一般的网络通信都是直接使用原始的Socket或是更高层面的Tcp,Udp。但这里受限用户生产环境的要求,没法直接使用Socket,只能借助与http协议进行数据交换.基础互流程图如下:
单条消息格式为:
{
“form_user": “xxxx”,
“to_user”: “xxxx”,
“msg_type”: “xxxx”,"
“msg”: “xxxx”
}
登录获取消息具体操:
- 用户使用post请求登录WebServer服务后获取session id。
- 接下来携带登录的session id使用跨域的get请求连接HttpServer。
- HttpServer接收到请求后拿到session id去验证是否合法。
- 如果不合法立即回response error。
- 如果合法再去数据库获取此用户的消息列表,将所有发送给自已的消息一次性打包给get请求回复response。
- 此时浏览器收到所有的消息,根据消息类型分别在各自的模块中展示,或做出相应的动作。
- 处理完成后再次发送相同的跨域get请求。
- HttpServer如果发现没有要get的消息,Hold住连接不回response,等待30s之后超时回response timeout。
- 浏览器收到response后跳回7,如果8中发现有消息跳回5,即可持续获取消息。
登录发送消息具体操作:
- 将要发送的消息使用post请求发送到HttpServer。
- HttpServer获取“to_user"的connection,找到后将消息打包给"to_user"回复response,给"from_user"response发送成功。
- 如果"to_user"是离线状态,将消息存到数据库。等待用户登录后再来获取。
技术难点
使用到两个不同端口的url,存在跨域的问题
get: http:192.168.1.18:8081?callback=1345555555 =>(HttpSever)
post: http:192.168.1.18:80 =>(WebServer)
使用get请求半pull,半push方式来hold住http请求的连接,超时重新建立连接达到Streaming的获取消息,两个浏览器之间基本达到即时通信的目的。