首页 > 解决方案 > Socket.io 发布/订阅与另一台服务器?

问题描述

我目前正在使用聊天服务器。我在构建它时考虑到了 kubernetes。我遇到的问题是我的 api 服务器处理除了聊天之外的所有内容。因此,当一个用户与另一个用户建立连接时,这是通过 api 服务器处理的。

我的聊天服务器看起来像这样:

io.on("connection", async (socket) => {
  const auth = await getUser(socket.handshake.auth.token);
  if (auth) {
    let chats = await getChats(auth.userID)
    chats.forEach(chat => {
      socket.join(chat)
    })
  }
}

这将使用户在连接到聊天服务器时加入他当前保存的所有聊天。但是,如果在进行另一次聊天时他已经连接了怎么办?

我将 socket.io-redis 用于 pub/sub 并认为如果我将 io 添加到我的 api 服务器中,我将能够执行以下操作:

聊天服务器:

socket.on(chatID, (content) => {
  console.log(content);
});

API 服务器:

resolve: async (parent, args, { models, io, auth }) => {
  io.emit(args.chatID, "test")
}

但是 pub/sub 只发给客户端,而不是其他服务器。

我看到 socket.io-redis 有一个remoteJoin。但我不知道这是否能够工作?

也许我想多了,有一个更简单的方法?我原本想做这样的事情:

redis.sadd(`chats:${user.id}`, args.chatID)

让聊天服务器监听任何更新,但我不知道该怎么做。我试过了:

redis.on(`chats:${user.id}`, (content) => {
  console.log(content)
  console.log('test')
})

但这没有用。

标签: redissocket.iosocket.io-redis

解决方案


推荐阅读