Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Are you able to have 2 connections for 2 separate servers open at the same time? #1847

Open
dills122 opened this issue Jan 13, 2024 · 1 comment

Comments

@dills122
Copy link

I'm working on a chat app with Nest.js and initially had a RedisIoAdapter.ts setup after reading some docs, and that is/was working fine. However, when I added another Redis instance & client I started to get the error.

Error: Redis is already connecting/connected

So its leading me to believe I can't have connections open for each of my two servers?

Overview of what I'm trying to do:

  • Server 1 (port 6379) - Pub/Sub IO Adapter
  • Server 2 (port 6380) - Meta-data cache for sessions

Server 1 gets its connection setup in the bootstrap method for the NestJS server. Then Server 2 gets setup in the RedisModule with its client.factory`.

If I disable one of them (IOAdapter is the easiest to disable/comment out) then it runs without an error, but if I start the app with both still enabled, I get the error above whenever the second connection trys to start.

Server 2 Client Factory:

import { FactoryProvider } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import Redis from 'ioredis';

export const redisClientFactory: FactoryProvider<Redis> = {
  provide: 'RedisClient',
  useFactory: (configService: ConfigService) => {
    const redisInstance = new Redis({
      port: configService.get('REDIS_DB_PORT'),
      host: configService.get('REDIS_DB_HOST')
    });

    redisInstance.on('error', (e) => {
      throw new Error(`Redis connection failed: ${e}`);
    });

    return redisInstance;
  },
  inject: [ConfigService]
};

Server 1 IOAdapter:

import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
import { Server, ServerOptions } from 'socket.io';
import * as util from '../shared/util';

import { INestApplicationContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

const host = util.isLocal() ? 'localhost' : 'redis';

export class RedisIoAdapter extends IoAdapter {
  protected redisAdapter;

  constructor(private app: INestApplicationContext) {
    super(app);
    const configService = this.app.get(ConfigService);
    const port: string = configService.get('REDIS_IO_PORT') || '';
    if (!port || port.length <= 0 || !host) {
      throw Error('Issue creating the Redis URL');
    }
    const pubClient = new Redis({
      host,
      port: Number(port)
    });
    const subClient = pubClient.duplicate();

    pubClient.connect(); // <------
    subClient.connect(); // <------

    this.redisAdapter = createAdapter(pubClient, subClient);
  }

  createIOServer(port: number, options?: ServerOptions) {
    const server = super.createIOServer(port, options) as Server;

    server.adapter(this.redisAdapter);

    return server;
  }
}
@JatSh1804
Copy link

import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
import { Server, ServerOptions } from 'socket.io';
import * as util from '../shared/util';

import { INestApplicationContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

const host = util.isLocal() ? 'localhost' : 'redis';

export class RedisIoAdapter extends IoAdapter {
  protected redisAdapter;

  constructor(private app: INestApplicationContext) {
    super(app);
    const configService = this.app.get(ConfigService);
    const port: string = configService.get('REDIS_IO_PORT') || '';
    if (!port || port.length <= 0 || !host) {
      throw Error('Issue creating the Redis URL');
    }
    const pubClient = new Redis({
      host,
      port: Number(port)
    });   
   //Create a new instance and initiate them individually 
    const subClient = new Redis({
      host,
      port:Number(port)
})

    pubClient.connect(); // <------
    subClient.connect(); // <------

    this.redisAdapter = createAdapter(pubClient, subClient);
  }

  createIOServer(port: number, options?: ServerOptions) {
    const server = super.createIOServer(port, options) as Server;

    server.adapter(this.redisAdapter);

    return server;
  }
}

If want to duplicate the same instance

 const subClient = new Redis({
      host,
      port:Number(port)
})
const pubClient=subClient.duplicate();
subClient.connect()

The pubClient is automatically connect (before call subClient.connect())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants