Websocket 个人总结

来源:互联网 发布:mac怎么播放wmv 编辑:程序博客网 时间:2024/06/05 19:07
一、websocket的实现。
     不管什么websocket,其他socket等等,他们都是基于跨主机进程间通信的机制socket实现。socket本身就是全双工的。因此用socket来实现相互交流肯定是可行的。
当前很多浏览器都已经支持了websocket,如果浏览器不支持,你做不了,可以用flash来做。
     具体的实现过程网上有很多,这里就不再赘述了,百度代码一大堆,而且实现功能并不难。接下来总结一下websocket的一些坑。

二、总结一些东西,方便以后查看,纯个人看法,毕竟不是专门搞这个的。有错误请指正。
1、浏览器问题
     如果浏览器不支持websocket,那么聊天就做不了, 可以换flash开发。

2、断网问题
     如果在聊天过程中,断网了,因为后端无法及时捕获用户连接的情况,前端又没有发出close的请求。这个时候前端就要做好心跳检测,后端提供心跳检测接口,如果在规定时间内没有收到心跳检测信息,就关闭掉socket连接。前端在规定时间内没有收到后端发过来的信息,就定时执行心跳请求,如果断开了就执行重连,建立一个新的socket连接。

3、对于离线用户信息的存储
     这一块的话主要就是把离线用户应该收到的信息存储到mysql,用户上线后,从数据库中把信息查询出来发送给该用户就可以了。

4、并发问题
     4.1、配置:如果连接聊天的人很多,必然会存在一个并发的问题, 关于并发问题,其实问题可能存在比较多,大家平常看一些redis,memcache,nginx都可以看到很多关于网络的配置项,我们在开发的时候,最好根据当前的场景和实际情况,(比如当前的操作系统选用最好的网络IO多路复用模型,比如linux2.6以后,选择用epoll来连接请求等等。 )去做出调整。
     4.2、多进程:如果单个进程处理不了用户的请求,那么可以fork多个进程来进行处理,一个进程处理一个聊天窗口,而不是单个进程通过聊天窗口把socket归类这样。
     4.3、集群:如果单机的多进程仍然处理不了业务,就需要搭建一个集群来处理。但是与http应用一样, 我们需要保证一个连接或者一个聊天窗口的所有人在同一台机器上,我们平时在处理session共享的时候一般用一个公共的存储介质,但是我个人不知道socket对象是否可以存储在一个公共的介质上,个人感觉上应该是不可行的。因为一个socket对象里面肯定有一些ip之类的信息,换到另外一台机器用这个对象,ip都不同了如何通信呢,当然这只是个人的见解。这边提供一个hash的方案,hash可以用nginx做, 也可以在客户端直接用js做,至于服务器的列表可以从监控机器接口获取。个人感觉在客户端js做hash更好。反正就是要保证一个连接始终发往一台机器的同一个进程中。

5、高可用问题
     5.1、单机多进程: 如果是多进程的处理,那么主进程可以直接负责这块工作,每次循环都判断子进程是否down了,down了重启,也可以根据子进程进程运行时间自动重启。
     5.2、集群: 集群的高可用需要增加监控,这边提供一个监控方案, 每台机器分别部署一个rpc服务,rpc提供一个接口查看本地的websocket服务,如果本地的websocket服务器不可用就返回给监控机器。为了防止误报(比如网络问题),可以尝试多次,或者组成一个监控机器的集群(类似于redis的sentinel,也可以参考mysql实现的mha)。
    

6、后台运行程序
     这个也比较简单, linux下面有nohup命令,当然你可以在程序中fork一下, 当前进程退出,子进程在后台继续执行。



     
     

     
原创粉丝点击