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

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 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
目录
相关文章
|
前端开发
socket.io 集群版
socket.io 集群版
293 0
|
存储 Web App开发 监控
C#Socket编程笔记,Socket 详解,入门简单
目录 一,网络基础 二,Socket 对象 三,Bind() 绑定与 Connect() 连接 四,Listen() 监听请求连接 和 Accept() 接收连接请求 五,Receive() 与 Send() 六,释放资源 七,IPAddress 和 IPEndPoint
499 0
C#Socket编程笔记,Socket 详解,入门简单
|
网络协议 Unix C#
|
22天前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
22天前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
|
22天前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
|
21天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
22天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。