WebSocket系列之socket.io

导语:上篇讲了WebSocket基础知识和浏览器端的实现,WebSocket server和http server也是有区别的,这篇开始讲nodejs平台的一个很成熟,知名度也最大的WebSocket实现--socket.io

socket.io:

1.跨浏览器、跨平台,多种连接方式自动切换

2.功能完善,心跳检测,断线自动重连

3.server和client必须配套使用,不能直接用原生WebSocket

socket.io server:

socket.io client:

参数说明:

1.client必须引用socket.io的client js文件,没法用原生WebSocket

2.server端的path和client端的path必须对应上,并且server端设置的path也是client引用的js的path

3.server端的serveClient控制socket.io client js是否可以被引用,默认true,如果设为false,那么client里会加载不到socket.io client js文件

4.client端的transports设置的是websocket连接的建立方式,默认值是'polling', 'websocket',可以设置成'websocket',区别是使用默认的会先用http拉取session id,再升级到WebSocket,如果设置成'websocket'会跳过http请求,直接用WebSocket建立连接,如下图:

'polling', 'websocket':

'websocket':

断线重连:

socket.io已经帮我们实现了断线重连,当server close的时候,client会马上探测到并开始尝试重连,如下图

多进程和分布式部署:

看了上面的说明,是不是觉得socket.io真简单,分分钟掌握,开始撸代码,却不知等到你的产品用户量上来的那一天,并发上不去了,你开始得心应手的用cluster开启多进程,还不够,再分部署部署,实现代码如下:

特别说明:你在windows版nodejs测试上面代码时,你会发现每次请求都到同一个worker,看着socket.io多进程正常运行,不过布到linux里就会出现请求400,那是因为windows版nodejs的负载均衡算法和linux不一样(负载均衡算法),linux用的Round-Robin(轮询调度),window版因为Round-Robin有性能问题,暂时用的操作系统的算法,不过文档说等到性能问题解决了,会切到Round-Robin,我们也可以如上面代码第三行,通过设置cluster.schedulingPolicy = 2;为windows开启Round-Robin,一旦开启,就会出现请求400,如下图:

出现400原因是:拉取session id的进程和用该session id建立连接的进程不是同一个,甚至不是同一台服务器,进程A给你分配的session id,进程B当然不认识,也就不会给你建立socket连接了,我们需要保证一个用户的多次连接由同一个进程处理,不仅是session id,也是因为不支持WebSocket的浏览器,socket.io会降级使用轮询实现socket,而这种socket是由多次请求组成的,如果两次请求不是同一个进程处理,运行时都不一致,会出现各种问题

解决方案:上面已经说了,就是保证一个用户的多次连接由同一个进程处理,具体怎么做了,就是nginx代理,原理是nginx支持根据client ip分发请求到对应进程

nginx可以把请求直接分发到nodejs的worker进程,这种就需要同一台机器的各worker进程监听私有端口,并且在nginx配置那里配置对应port,或者由master进程监听一个端口,nginx分发请求到master,再由master分配到worker,这就是socket.io里的sticky session,下面说明

sticky session(实现代码如下图):

说明:

1.根据cpu数开启多进程

2.master监听一个port,启动net server,参数pauseOnConnect:true必须有,因为master接收connect,是为了再分发到worker,master不需要读取数据,数据读取应该由worker来完成

3.根据remoteAddress决定分发给哪个worker,这样就能保证同一个remoteAddress必然由同一个worker处理

至此sticky session实现完成,完美根据client ip分发请求,再也不会请求400了

demo代码都放在附件了,各位可以本地运行试下,当然本地需要安装nodejs和socket.io了

附件:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程一生

PHP童鞋改JAVA代码怎么处理

16720
来自专栏编程微刊

如何运行vue项目(维护他人的项目)

前提: 首先,这个教程主要针对vue小白,并且不知道安装node.js环境的。言归正传,下面开始教程:在维护项目之前,需要把所有的环境搭建好,这里我就不多说了...

13620
来自专栏butterfly100

Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯

Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的...

32660
来自专栏王磊的博客

Sql自动配置器原理及其说明

简介:Sa设置辅助器设计的初衷是为了抛开繁琐与重复的配置,这种繁琐到了一定程度回使人厌烦,重复到了一种程度让人觉得无趣,为了解决这种厌烦与无趣,她就出现与产生了...

36760
来自专栏ccylovehs

windows开机提示文件损坏

心情果断灰暗下来,按照提示一步步操作,点enter进入高级选项,试过了安全模式启动、最后一次正确配置启动、带命令提示符的安全模式启动都在读取驱动文件amdxat...

48310
来自专栏梧雨北辰的开发录

使用charles无法抓取到iOS Simulator的请求数据包

情况1:没有安装模拟器证书 解决:charles->Help -> Install Cahrles CA SSL Certificatein iOS Simul...

50650
来自专栏大数据平台TBDS

Hiveserver2 性能优化与GC优化

最近发现hiveserver2(本质上是提供jdbc连接的driver进程)经常发生严重卡死故障,而且卡死分成两种现象。

1.2K100
来自专栏FreeBuf

SUpraudit:一款MacOS上的日志审计工具

你可能对BSM审计有所了解,也可能完全没有听说过。这是Solaris OS遗留下来的产物,它存在于FreeBSD,Linux,当然还包括MacOS上。在我的*O...

23340
来自专栏用户2442861的专栏

CQRS架构简介

http://www.cnblogs.com/netfocus/p/4055346.html

17520
来自专栏魏艾斯博客www.vpsss.net

lnmp1.4 环境安装 memcached 和 object-cache.php 过程记录及内存缓存加速效果

33220

扫码关注云+社区

领取腾讯云代金券