网站源码搭建:websocket连接太多导致效劳器卡顿怎么办?一招轻松
本文摘要: 前言项目中有即时谈天的需求,通过调研我们选用了socket.io自己完成了一个谈天效劳器。开始的一段时间因为用户不是很多,音讯的发送接收都还算流畅,最近跟着在线用户数量飙升,每过一段时间就会发生发送音讯卡顿和接收音讯延时

前言


项目中有即时谈天的需求,通过调研我们选用了socket.io自己完成了一个谈天效劳器。

开始的一段时间因为用户不是很多,音讯的发送接收都还算流畅,最近跟着在线用户数量飙升,每过一段时间就会发生发送音讯卡顿和接收音讯延时的问题,终究只能通过重启socket效劳来暂时解决问题。

那有无方法从底子上解决这个问题呢?

目录

  1. 什么是socket.io
  2. socket.io完成一个简易的即时谈天应用
  3. socket.io支撑散布式布置吗?
  4. 总结

什么是socket.io?


在介绍什么是socket.io之前,不能不先提一下WebSocket

我们都知道HTTP协议是一种单向的网络通讯协议,效劳端只能被动呼应来自客户端的请求,却不能主意向客户端推送数据。

WebSocket技能没有呈现之前,假如要开发一个需要实时获取效劳端数据的Web应用,常见有以下两种方式:ajax轮询Long Polling。
  • ajax轮询的原理其实很简略,就是让客户端每隔一小段时间就主意向效劳端发送一次请求,假如有新数据客户端就把它显示出来。
  • 可以看出不管有无新数据,ajax轮询都会定时向效劳端发起请求,这会导致效劳端没必要要的性能耗费,Long Polling就是对ajax轮询的一种改善。客户端向效劳端发送请求,效劳端不会当即就呼应客户端而是会先坚持住此次连接,直到有新的数据时才会返回,客户端接收到数据之后再当即发送一个新的请求给效劳端,其实不断得重复这一过程。

可以看出这两种方式都需要不断的建立连接,可是建立连接是一个比较耗费性能的操作,这个时分假如有一个新的通讯协议可以支撑客户端和效劳端双向通讯就行了,所以WebSocket应运而生。


WebSocket是HTML5新增的一种通讯协议。WebSocket协议是一种支撑双向通讯的协议,它和HTTP协议一样通过TCP来进行数据传输,可是WebSocket又不同于HTTP:
  • WebSocket是一种支撑双向通讯的协议,两边在建立连接后都能主意向对方发送或接收数据。
  • 客户端和效劳端要想进行WebSocket通讯有必要先握手交换信息,成功之后才干进行通讯。

说了这么多,那么WebSocket跟socket.io又是什么关系呢?

一直以来我都认为socket.io只是WebSocket协议的一种完成罢了,深化之后才发现这种观念不完全正确。

socket.io是一个基于Node.js技能和WebSocket协议开发的实时的,可双向通讯的和基于工作的的开源通讯框架

WebSocke是HTML5新推出的协议,干流阅读器对它的支撑还不是很完善,所以socket.io不只仅完成了WebSocket协议,除此之外它还支撑一些其他的通讯方式,比如前面我们提到的ajax轮询和Long Polling等,可以依据阅读器的支撑程度切换不同的通讯方式。

用socket.io完成一个简易的即时谈天应用


接下来我们就是使用socket.io来完成一个简易的即时谈天的web应用。

先来看一下效果:


下面简略介绍一下完成方式,主要分为客户端和效劳端两个部分。

效劳端核心代码:


效劳端主要界说了3个监听工作,分别用来监听客户端的加入群聊、发送音讯和脱离群聊工作,效劳端在监听到工作后会再通过broadcast.emit方法将音讯向全体用户播送。

客户端核心代码:


主要流程:
  1. 向socket效劳端请求连接;
  2. 自己向效劳端发送加入群聊请求;
  3. 监听效劳端播送的其他用户加入群聊音讯;
  4. 监听效劳端播送的用户谈天信息;
  5. 监听效劳端播送的用户脱离群聊音讯;

socket.io支撑散布式布置吗?


socket效劳端维护连接是一个十分耗费性能的操作,那么很多的连接必定会给效劳器带来十分大的性能压力,当单台socket效劳器支撑不了时该怎么办呢?

解决方案其实也很简略:分而治之,我们可以将多个socket效劳端组成负载均衡集群,再将连接均匀分配到每一个效劳端。

有人也许会提出疑问:多个socket效劳端之间怎么通讯?比如用户1连接到了socket效劳端1,用户2连接到了socket效劳端2,那么用户1发的音讯怎么播送到socket效劳端2呢?

这里就需要提一下Redis了,对你没看错,就是那个用作缓存的Redis。

其实Redis除了当作缓存使用之外,它还有一个十分凶猛的功用:发布/订阅

Redis的发布订阅机制包括三个部分:发布者、订阅者和频道。 发布者将音讯发送到某个频道,那么Redis效劳器就会主动将音讯推送到订阅了这个频道的所有订阅者。

socket.io正式使用Redis的发布订阅机制来支撑散布式布置的:


当客户端1通过emit触发了一个工作到socket效劳端1,socket效劳端1将这个音讯发送到Redis的某个频道,订阅了这个频道的socket效劳端2就会收到这个音讯,socket效劳端2再向连接它的用户播送就好了。

代码添加reidssocket.io-redis模块:


总结


socket.io是一个基于Node.js技能和WebSocket协议开发的实时的,可双向通讯的和基于工作的的开源通讯框架。除此之外它还兼容ajax轮询和Long Polling等前后端通讯方式,我们可以依据阅读器的支撑程度进行自在切换。

socket.io十分合适客户端和效劳端需要进行实时通讯的场景,它使用Redis的发布订阅机制可以完成散布式布置,这让socket效劳端横向扩展变得很加容易。

“分享常识,收获快乐”

我是一名程序员,喜欢我的文章欢迎 重视 及 转发,我会常常与我们分享一些工作傍边的编程技巧与经历。

【免责声明】本文仅代表作者或发布者个人观念,不代表(www.lmnkf.cn)及其所属公司官方发声,对文章观念有疑义请先联络作者或发布者自己修正,若内容触及侵权或违法信息,请先联络发布者或作者删除,若需我们协助请联络平台管理员,Emailcxb5918(本平台不支撑其他投诉反馈渠道,谢谢合作)。若需要学习以上相关常识请到巨推学院观看视频教程,网站地址www.tsllg.cn。

相关内容