繁体   English   中英

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

[英]How to use PM2 Cluster with Socket IO?

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

我正在使用 Artillery 进行测试。 当应用程序在单核上运行时,我得到响应,而它在集群中运行时,响应将为 NaN

在集群中运行时

在没有集群的情况下运行时

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

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

当集群中跑

当无群奔跑时

NESTjs服务器

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

我需要扩展 nest 的高级类“ioAdapter”,该类只适用于普通的 ws 连接,而不适用于我们的 pm2 集群

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

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 而不是使用轮询

...
@WebSocketGateway({ transports: ['websocket'] })
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
...

或者如果您使用命名空间

...
@WebSocketGateway({ transports: ['websocket'], namespace: 'user' })
export class UsersGateway {
...

最后一步是在您的 AWS 实例上安装 redis 数据库,这是另一回事; 并安装pm2

nest build
pm2 i -g pm2
pm2 start dist/main.js -i 4

客户

const config: SocketIoConfig = {
  url: environment.server.admin_url, //http:localhost:3000
  options: {
    transports: ['websocket'],
  },
};

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

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

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

当集群中跑

当无群奔跑时

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

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

当集群中跑

当无群奔跑时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM