socket.io 集群版——旧版归档笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: socket.io 集群版——旧版归档笔记

写在前面

本笔记所记录的方式来源于 socket.io 官方文档,但是实际测量下来经过这样后还会有问题,最后迫不得已,将 websocket 功能抽出成单独的服务。


中文文档

官方文档


注意

截止到目前(2021年11月17日),中文文档和官方文档中都使用了socket.io-redis这个包,但是这个包已经在 6 个月前就声明 deprecated 了,迁移至新的@socket.io/redis-adapter地址了。


实现原理与方式

写不过来了,有空补。


使用redis包

注意

目前 redis 包升级到了 4.x ,官方文档上的写法已经不可以了,官方文档还没有给出新的写法,如果使用这个方案,暂时先使用 redis 3.x 吧(记录于2022年1月11日)。


安装必要包

$ pnpm add @nestjs/websockets @nestjs/platform-socket.io socket.io @socket.io/redis-adapter redis
$ pnpm add -D @types/redis点击复制复制失败已复制


编写适配器

建立适配器文件 redis-io.adapter.ts ,写入如下内容:

import { ConfigType } from '@nestjs/config';
import { NestExpressApplication } from '@nestjs/platform-express';
import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { createClient, RedisClient } from 'redis';
import { ServerOptions } from 'socket.io';
import { RedisConfigRegister } from '../../config/registers/redis.register';
/** socket.io redis 适配器 */
export class RedisIoAdapter extends IoAdapter {
  constructor(app: NestExpressApplication, redisConfig: ConfigType<typeof RedisConfigRegister>) {
    super(app);
    this.pubClient = createClient({ host: redisConfig.common.host, port: redisConfig.common.port });
    this.subClient = this.pubClient.duplicate();
  }
  private pubClient: RedisClient;
  private subClient: RedisClient;
  createIOServer(port: number, options?: ServerOptions): any {
    const server = super.createIOServer(port, options);
    server.adapter(createAdapter(this.pubClient, this.subClient));
    return server;
  }
}点击复制复制失败已复制


提示

主要参考 socket.io 的官方文档中redis适配器部分。


使用

main.ts 文件中配置,具体参考如下:

……
const app = await NestFactory.create<NestExpressApplication>(AppModule); 
const redisConfig = app.select(AppModule).get<ConfigType<typeof RedisConfigRegister>>(RedisConfigRegister. KEY); 
// 使用Redis socket.io适配器
app.useWebSocketAdapter(new RedisIoAdapter(app, redisConfig)); 
……点击复制复制失败已复制


使用ioredis包

安装必要包

$ pnpm add @nestjs/websockets @nestjs/platform-socket.io socket.io @socket.io/redis-adapter ioredis点击复制复制失败已复制


编写适配器

建立适配器文件 redis-io.adapter.ts ,写入如下内容:

import { ConfigType } from '@nestjs/config';
import { NestExpressApplication } from '@nestjs/platform-express';
import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Cluster } from 'ioredis';
import { ServerOptions } from 'socket.io';
import { RedisConfigRegister } from '../../config/registers/redis.register';
/** socket.io redis 适配器 */
export class RedisIoAdapter extends IoAdapter {
  constructor(app: NestExpressApplication, redisConfig: ConfigType<typeof RedisConfigRegister>) {
    super(app);
    this.pubClient = new Cluster([{ host: redisConfig.common.host, port: redisConfig.common.port }]);
    this.subClient = this.pubClient.duplicate();
  }
  private pubClient: Cluster;
  private subClient: Cluster;
  createIOServer(port: number, options?: ServerOptions): any {
    const server = super.createIOServer(port, options);
    server.adapter(createAdapter(this.pubClient, this.subClient));
    return server;
  }
}
点击复制复制失败已复制


提示

主要参考 socket.io 的官方文档中redis适配器部分。


使用

main.ts 文件中配置,具体参考如下:

……
const app = await NestFactory.create<NestExpressApplication>(AppModule); 
const redisConfig = app.select(AppModule).get<ConfigType<typeof RedisConfigRegister>>(RedisConfigRegister. KEY); 
// 使用Redis socket.io适配器
app.useWebSocketAdapter(new RedisIoAdapter(app, redisConfig)); 
……
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
监控 Python
视频监控笔记(五):Jetson Nano上通过Tkinter和Socket实现GUI文件传输
这篇文章介绍了如何使用Python的Tkinter和Socket在Jetson Nano上实现图形用户界面(GUI)的文件传输系统,包括服务器端和客户端,能够进行文件的发送和接收,并展示传输进度。
41 1
|
5月前
|
存储 缓存 网络协议
技术笔记:socket网络实现
技术笔记:socket网络实现
21 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态2
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态2
54 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之自定义指令创建之2
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之自定义指令创建之2
50 0
|
JavaScript 前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之原生dom导入和移除的技巧2
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之原生dom导入和移除的技巧2
40 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之响应式和视图数据渲染1
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之响应式和视图数据渲染1
59 1
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之创建客户端和socket链接1
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之创建客户端和socket链接1
56 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态3
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态3
34 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态1
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之socket发送文本状态1
34 0
|
前端开发
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之自定义指令创建之1
前端学习笔记202305学习笔记第二十九天-Socket.io文本编辑实时共享之自定义指令创建之1
46 0