socketio redis adapter广播和向另一个集群节

2022-09-09  本文已影响0人  哆啦在这A梦在哪

前提条件:

socketio v4 版本,对应 redis 版本 6.1以上
在这里描述也是github资料:https://github.com/socketio/socket.io-redis-adapter

image.png

基本资料:

1.基本连接过程: https://socket.io/docs/v4/redis-adapter/
2.使用的几个方法: https://socket.io/docs/v4/server-instance/#fetchsockets

  1. github资料:https://github.com/socketio/socket.io-redis-adapter
    github中显示了所有方法的使用例子,个人觉得别上面那几个文档好用,这里找到 RedisAdapter 这一章的资料接口

一。连接

使用代码案例,连接方式官方几种方式都有,这里简单写一个,主要看二里面方法的使用:

const rds = redis.createClient("127.0.0.1:6543");
const pubClient = rds;
const subClient = pubClient.duplicate();

subClient.connect().then(() => {
   io.adapter(createAdapter(pubClient, subClient));   
});

二。广播和不同节点之间连接发送(不同节点一对一发送)

  io.on("connection", (socket, req) => {
    socket.on("allclients", async () => {
// 参数 rooms 写入房间名称,反馈所有房间内的连接对象
// 这里获取了房间名称为 room-test 的房间内所有连接
// 这里的连接指的是所有 redis adapter 中的连接,
// 也就是说,只要在这个房间内,即使客户端连接的是不同服务器,也能获取到,
// 这时候,只需要自己设置一下用户信息即可,我这里使用的是query参数,
// 你也可以保存一份 client id和用户的对照表
      const cons = await io.adapter.fetchSockets({
        rooms: ["room-test"],
        except: [],
      });
      if (!cons) {
        return;
      }
      cons.forEach((element) => {
        console.log("element.handshake:", element.handshake.query.name);
      });
// io.adapter.sockets 这个方法反馈了所有房间内的 client id(包括不同节点)
      const cs = await io.adapter.sockets(new Set(["room-test"]));
      console.log("cons:", cs);
// allSockets 也可以获取 room-test 房间内所有client id,区别是上面可以多个,这个对应单个房间
console.log("allSockets cons:", await io.in("room-test").allSockets());
    });
  });

总结

1.获取所有集群中的连接对象

这里以房间“room-test”为例

await io.adapter.fetchSockets({
        rooms: ["room-test"],
        except: [],
      })

2.获取所有集群中的client id

这里以房间“room-test”为例

await io.adapter.sockets(new Set(["room-test"]))
await io.in("room-test").allSockets()
上一篇下一篇

猜你喜欢

热点阅读