小白的踩坑记录——socket.io-解决多进程
来源:互联网 发布:中国大学生网络党课 编辑:程序博客网 时间:2024/05/29 16:19
需求:
利用socket.io实现多进程长连接,实时获取kafka数据
问题重现:
启动单个进程的时候,socket.io可以正常的获取到长连接进行实时数据,但是利用多个线程的时候就会报长连接404,并且下图已经清晰的显示了socket.io握手的错误:
有图可见,ws连接建立之前多出了三个http的请求,而且是每三个http请求之后就会有ws请求,这就说明,socket.io没有直接建立ws连接方式,而是先通过http请求访问服务端的相关轮训配置信息以及sid,sid唯一标识连接,可理解为socketId。
为什么会出现这种情况呢?
当我们开启一个进程的时候,就不会出现这种404的报错,但是当我们启动了多个线程的时候就会出现这种问题。当前实例是用pm2启动的多线程,利用了pm2中的某种算法,但是这种算法socket.io并不支持,因此在socket.io客户端连接建立阶段发送的多个http请求,会被pm2定位到不同的worker进程中,总而言之,客户端多次请求的服务端进程不是同一个进程才导致的ws连接无法成功建立。
那怎么解决呢?
那么如何才能解决呢?最简单的方案就是确保客户端的每次请求都可以定位到同一个服务进程即可。
官方解决方法:利用nginx反向代理+iphash官方地址: https://socket.io/docs/using-multiple-nodes/本实例利用官网这种方式解决的,具体如下:
第一种方法:
nginx.conf
upstream io_nodes { ip_hash; server 127.0.0.1:3131; server 127.0.0.1:3132; server 127.0.0.1:3133;}server { listen 3000; server_name io.yourhost.com; location / { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_http_version 1.1; proxy_pass http://io_nodes; }}
app.js
import socketList from './src/router/socket';const app = new Koa();// socket - socket.ioconst server = require('http').createServer(app.callback());server.setMaxListeners(30);const port = 3131 + parseIn(process.env.NODE_APP_INSTANCE);socketList.initialize(port);app的详细配置就不展示了...export default server;// pm2server.listen(port, () => console.log(`Server started on port ${port}`));
vue重要代码
import VueSocketio from 'vue-socket.io';Vue.use(VueSocketio, url);
第二种方法:
利用sticky-session插件
app.js
import socketList from './src/router/socket';import sticky from 'sticky-session';const app = new Koa();// socket - socket.ioconst server = require('http').createServer(app.callback());server.setMaxListeners(30);socketList.initialize(server);app的详细配置就不展示了...export default server;// stickyconst options = { workers: 3};if (!sticky.listen(server, port, options)) { // Master code server.once('listening', () => { console.log('server started on 3000 port'); });} else { console.log('sticky listen'); // Worker code}
我是初次接触socket.io的小白,对socket.io的理解还不到位,对于文章当中的专业说法还不到位,如果有建议,我会非常开心的接受并修改的,也希望和大家分享我自己的浅见。
阅读全文
1 0
- 小白的踩坑记录——socket.io-解决多进程
- 小白的踩坑记录——SOCKET.IO—API
- 小白的坑记录
- Node.js 基于socket.io聊天室的BUG解决经过
- 【基于Cocos Creator+Socket.io的联机对战黑白棋(1)】——Socket.io简单入门
- 多进程编程——记录锁
- 多进程编程——记录锁
- 强大的socket.io
- socket.io的helloworld
- socket的IO模型
- 记录一下进程监控的一种小技巧
- 记录一下进程监控的一种小技巧
- 高级IO(文件的读写)——并发式IO的解决方案(解决多路阻塞式IO的方案)
- Java IO——Socket基础
- linux socket tcp server 解决客户端socket断开后, 服务器端进程退出的问题
- java基础——IO相关的小细节
- 多进程 socket exit的问题
- socket通信的多进程编程:
- 银行客户管理系统的实现
- SQL主鍵:日期+序列
- Java多线程--Exchanger(一)
- 使用SSM框架整合时,无法创建XXXXBean
- Asp.Net MVC 5使用Identity之简单的注册和登陆
- 小白的踩坑记录——socket.io-解决多进程
- 动态内存开辟
- spring-Scheduled
- 对称的二叉树
- Java多线程--Exchanger(二)
- Oracle之JAVA数据导出工具-yellowcong
- 欢迎使用CSDN-markdown编辑器
- CentOS 中 nginx 负载均衡和反向代理的搭建 阅读 2449
- 高逼格Mac应用程序、软件分享【主要面向开发者和设计师】