首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用带Socket IO的PM2集群?

如何使用带Socket IO的PM2集群?
EN

Stack Overflow用户
提问于 2018-03-06 01:33:39
回答 4查看 3.1K关注 0票数 5

我正在开发一个完全依赖于Socket.io的应用程序。众所周知,默认情况下,NodeJS只在一个内核上运行。现在,我想将其扩展到多个内核。我发现很难让socketio在PM2集群模式下工作。任何示例代码都会有所帮助。

我正在用炮兵来测试。当应用程序在单核上运行时,我会得到响应,而它在集群中运行,响应将是NaN

When Ran Without Cluster

EN

Stack Overflow用户

发布于 2021-05-23 07:25:32

NESTjs服务器

我使用的是Socket server 2.4.1,所以我得到的兼容redis适配器是5.4.0

我需要扩展nest的更熟练的类"ioAdapter“,该类只适用于普通的ws连接,而不适用于我们的pm2集群。

代码语言:javascript
运行
复制
import { IoAdapter } from '@nestjs/platform-socket.io';
import * as redisIOAdapter from 'socket.io-redis';
import { config } from './config';

export class RedisIoAdapter extends IoAdapter {
  createIOServer(port: number, options?: any): any {
    const server = super.createIOServer(port, options);
    const redisAdapter = redisIOAdapter({
      host: config.server.redisUrl,
      port: config.server.redisPort,
    });
    server.adapter(redisAdapter);
    return server;
  }
}

这实际上是nestjs实现。

现在,我需要使用该实现告诉nest im,因此我转到了main.ts

代码语言:javascript
运行
复制
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { config } from './config';
import { RedisIoAdapter } from './socket-io.adapter';
import { EventEmitter } from 'events';

async function bootstrap() {
  EventEmitter.defaultMaxListeners = 15;
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  app.useWebSocketAdapter(new RedisIoAdapter(app));
  await app.listen(config.server.port);
}
bootstrap();

我有很多事件,所以我必须增加我的最大事件计数

现在,对于您获得的每个网关,您需要使用不同的连接策略,因此您需要直接转到websocket,而不是使用轮询

代码语言:javascript
运行
复制
...
@WebSocketGateway({ transports: ['websocket'] })
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
...

或者,如果您使用的是命名空间

代码语言:javascript
运行
复制
...
@WebSocketGateway({ transports: ['websocket'], namespace: 'user' })
export class UsersGateway {
...

最后一步是install the redis database on your AWS instance and that is another thing;并安装pm2

代码语言:javascript
运行
复制
nest build
pm2 i -g pm2
pm2 start dist/main.js -i 4

客户端

代码语言:javascript
运行
复制
const config: SocketIoConfig = {
  url: environment.server.admin_url, //http:localhost:3000
  options: {
    transports: ['websocket'],
  },
};

现在,您可以使用FireCamp测试websocket服务器

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49116291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档