阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

socket.io搭建分布式Web推送服务器

220次阅读
没有评论

共计 2087 个字符,预计需要花费 6 分钟才能阅读完成。

socket.io 是目前较为流行的 web 实时推送框架,其基于 nodejs 语言开发,底层用 engine.io 实现。借助 nodejs 语言异步的特性,其获得了不错的性能。但单个实例的 socket.io 依然承载能力有限,最多只能容纳 3000 个 long-polling 方式的客户端进行连接。

将 socket.io 进行分布式扩展的难点有两处:

1. 进行负载均衡时连接必须保证始终连到一个节点上

如果客户端采用 long-polling 长轮训方式进行连接,则每次轮训都会产生一个新的请求,若不进行限制。就有可能连接到集群内新的 socket.io 节点上,导致异常的发生。

解决方法:使用 nginx 的 ip_hash 实现 session sticky,让客户端始终连接到集群内一台节点上。

2. 多个实例之间的消息推送

当集群内某台节点想要向连接到集群的所有客户端发送消息时,某些客户端因为负载均衡时 ip_hash 可能被分配到了其他的节点上,这时就需要向其他节点发布推送消息,让其他节点的同时向客户端进行推送。

解决方法:使用 redis 的发布与订阅功能与 socket.io-redis 开源库,实现节点间消息推送。

准备安装的软件:

nginx, nodejs, redis 以及一个 socket.io 应用,如一个聊天服务器,例子请见官网这里。

具体步骤:

1. 将 socket.io 应用部署成两个实例,如在同一台主机上为每个实例分配不同的端口号 4000, 5000:

http.listen(4000, function(){
  console.log(‘listening on *:4000’);
});

2. 配置 nginx 文件,设置负载均衡 proxy

upstream chat_nodes {
        ip_hash;
        server 127.0.0.1:4000;
        server 127.0.0.1:5000;
}

以及反向代理设置(注意为了支持 websocket 协议,需将 nginx 升级至 1.3.12 版本以上

location / {
        proxy_pass              http://chat_nodes;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection “upgrade”;
        proxy_http_version      1.1;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

完成配置后,重启 nginx。

3. 安装 nodejs 模块 socket.io-redis

sudo npm install socket.io-redis

4. 在原来 socket.io 应用中初始化 io 的位置加入 io 的 redis 适配器:

var redis = require(‘socket.io-redis’);
io.adapter(redis({ host: ‘localhost’, port: 6379}));

5. 重启各个 socket.io 应用,进行测试。

其他注意点:

由于 nginx 的反向代理机制和 socket.io 的自动重连机制,上述架构还具备高可用的特性,即当某个节点 down 机时,原先连接到该节点上的客户端会自动重连至其它节点上。

节点的数量可以随时增减,不需要暂停服务,只需修改 nginx 配置即可。

nginx 的 ip_hash 是基于 ip 的前三段进行计算的,也就是说 ip 只有 D 段不同的两台客户端一定会连接到同一台服务器上,这点测试的时候需要注意。

可以通过 redis 的订阅发布服务来实现其他系统同集群的通信,完成集群的管理工作。

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计2087字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中