redis - 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')
})
但这没有用。
解决方案
推荐阅读
- c# - C# SQLite 多个关键字与 like 命令
- java - 我在确认 java 中的两个密码时遇到困难,我在 if else 中的条件语句看起来不起作用
- javascript - 在关闭键盘建议(在 Android 上)时,如何在 React Native 中安全地切换密码可见性?
- powershell - 使用为此目的格式化的文本文件将文件族移动到自己的文件夹中
- azure - Azure 中 VM 之间的时间同步偏差和偏移量 (VMSS)
- python - Discord 自定义活动属性错误,表情符号对象没有属性“get”
- azure - 如何在 Azure 上重新安装 Windows Server VM
- html - onclick 在第一次点击时不起作用,但在第一次点击后工作正常
- java - 数组中字符串的排列需要以相同的顺序排列,但不是
- python - 部分输入和输出的自定义损失