我正在开发一个完全依赖于Socket.io的应用程序。众所周知,默认情况下,NodeJS只在一个内核上运行。现在,我想将其扩展到多个内核。我发现很难让socketio在PM2集群模式下工作。任何示例代码都会有所帮助。
我正在用炮兵来测试。当应用程序在单核上运行时,我会得到响应,而它在集群中运行,响应将是NaN
发布于 2021-05-23 07:25:32
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 {
...
最后一步是install the redis database on your AWS instance and that is another thing;并安装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服务器
https://stackoverflow.com/questions/49116291
复制相似问题