You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE中Socket.io+Redis Adapter实现副本间事件通信的问题

GKE中Socket.io多副本Redis Adapter跨节点事件触发问题解决

问题根源

  1. Redis客户端未连接:代码中创建了Redis客户端但未调用.connect(),导致Redis Adapter无法启用发布订阅机制,跨实例事件无法同步
  2. 事件监听/触发方式错误:
    • Server1中直接用io.on("custom-event")监听自定义事件的方式不正确,跨实例服务器端事件需要配合serverSideEmit使用
    • socket.emit仅向当前客户端发送事件,io.emit仅覆盖当前实例的客户端,无法触发其他服务器实例的监听逻辑
  3. 事件名称不匹配:触发代码中混用了custom-event和custom event(含空格),导致事件无法被正确捕获

修复代码示例

监听端(Server1)

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis";

const io = new Server();

// 初始化Redis客户端
const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

// 监听Redis连接错误
pubClient.on("error", err => console.error("Redis pub client error:", err));
subClient.on("error", err => console.error("Redis sub client error:", err));

// 必须显式连接Redis
await Promise.all([pubClient.connect(), subClient.connect()]);

// 挂载Redis Adapter
io.adapter(createAdapter(pubClient, subClient));
io.listen(3000);

// 监听跨实例服务器端事件
io.on("custom-event", () => {
  console.log("Custom event received from another server instance");
});

触发端(副本服务器)

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import { createClient } from "redis";

const io = new Server();

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

pubClient.on("error", err => console.error("Redis pub client error:", err));
subClient.on("error", err => console.error("Redis sub client error:", err));

await Promise.all([pubClient.connect(), subClient.connect()]);

io.adapter(createAdapter(pubClient, subClient));
io.listen(3000);

io.on("connection", socket => {
  // 向所有服务器实例发送事件(包括自身)
  io.serverSideEmit("custom-event");
  
  // 若需向所有跨实例客户端广播事件,使用以下代码
  // io.emit("client-broadcast-event", "data to all clients");
});

额外注意事项

  • GKE环境Redis访问:确保Redis服务在集群内可达(比如用StatefulSet部署或托管Redis),检查Pod网络策略允许访问Redis端口6379
  • Redis版本兼容:@socket.io/redis-adapter需要Redis v4+客户端,确保依赖版本匹配
  • 错误处理:建议添加Redis连接错误监听,便于排查网络或配置问题

内容的提问来源于stack exchange,提问作者Azeem Haider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:28