soket.io综述
socket.io出来很多年了,然应用范围不太广泛,本文做一些实验性的应用,宗旨是使用node+sokcetio+redis构建一套分布式的可多人在线的系统。网易以前做了一套架构叫pomelo,也有java架构netty,欢迎大家一起研究.
微博webim、微信网页版都用了长轮询方案,而不是长连接,所以此处只做研究使用。
微信长轮询初探
截至2018年4月11日,微信网页版还是使用长轮询方案,但是此方案有他自己的机制。可通过Chrome分析可得:
1.进入和一个人的对话页面后,会发起以“ttps://http://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=”开头的get请求。这是一个长轮询,服务端不会立马返回;
2.如果25s后对方未给你发消息,服务端会返回一段js代码“window.synccheck={retcode:"0",selector:"0"}”之类,这一个get请求结束,网页会重新发起长轮询;以此往复;
3.如果对方发给你消息,服务端立马会返回该get请求,返回内容是一段js代码“window.synccheck={retcode:"0",selector:"2"}”;
4.网页根据这段代码,发起新的post请求,获取刚才对方发来的消息;
5.如果你主动给对方发消息,会产生一些新的post请求(我观察到两条post,一个是应该是用于消息传输给服务器,一个是通知服务器同步的,可能),然后服务器会立马返回1中的get请求,反馈内容为“window.synccheck={retcode:"0",selector:"2"}”;
6.和4类似,网页根据这段代码,发起新的post请求,但返回的消息我没有观察到有效的payload,不知道5为何返回这段js。以上是网页版微信通信的大致流程。个人认为,以长轮询为基础,但增加了自定义的机制(每25s发起新的长轮询),能够简单有效保证网页端的IM,降低了客户端的复杂度,也不会给服务端带来性能上的巨大压力。
此处为网上摘抄,没有验证。