【问题标题】:Socket IO and Dynamic RoomsSocket IO 和动态房间
【发布时间】:2019-08-24 21:14:39
【问题描述】:

如果有人对 Websockets / Socket IO 有经验,希望您能指出我正确的方向。

我制作了一个 Discord 克隆,并正在尝试对其进行优化以更好地扩展。现在,当用户发送消息时,我会在数据库中查询该服务器的所有用户部分,并向他们的特定套接字发出消息。这显然不会很好地扩展,因为每条消息都需要在客户端列表中进行昂贵的查询和查找

// Emit messages to only users part of specific server
    // Will only return list of users part of server and active in last 10 minutes
    sqlQuery = `SELECT userservers.user_id FROM userservers 
                  JOIN users ON users.user_id = userservers.user_id AND users.user_last_active > (NOW() - INTERVAL 10 minute)
                  WHERE server_id = ${sql.escape(serverId)}`;
    const users = await sql.query(sqlQuery);
    action = { type: "message", payload: msg };

    // Iterate over users, and find them in clients list
    // Emit over socket only to that user
    users.forEach((user) => {
      clients.forEach((client) => {
        if (client.userId === user.user_id) {
          io.to(client.id).emit(user.user_id, action);
        }
      })
    });

但是,为每个服务器使用房间将消除我查询数据库的需要。我知道我可以在套接字服务器首次启动时执行此操作

// Get server list from Mysql DB
servers.forEach((server) => {
    socket.join(server.name);
}

但是我的问题变成了,当用户在应用程序已经运行后创建新服务器时,它不会更新列表。

我可能错过了一些关于创建动态房间的概念。

编辑:我认为解决方案可能是每次创建“服务器”时,我都会向套接字服务器发送一条消息,以便它可以加入那个“房间”

【问题讨论】:

    标签: javascript node.js websocket socket.io


    【解决方案1】:

    现在,当用户发送消息时,我会在数据库中查询该服务器的所有用户部分

    我认为您可以向所有在线用户提交广播消息,因此您可以向所有连接的用户io.emit('some event', { for: 'everyone' }); 而不是forEach client => io.to(clientId) 提交广播消息

    我也想知道您为什么要创建许多服务器?您可以使用const namespace = io.of('/thisIsASeparateNamespace'); 将您的服务器划分为多个命名空间,也可以通过namespace.emit('some event', { for: 'everyone in name space' }); 向该命名空间内的所有用户提交广播消息

    所以你的聊天结构可以是这样的

    服务器

    • 命名空间//用于单独的聊天应用程序/或类似松弛的工作空间
    • 房间 // 用于群聊
    • ClientID // 一对一

    【讨论】:

    • 这和 Discord 完全一样,任何用户都可以在其中创建服务器和频道。不确定我是否理解您的方法,但我会再考虑一下
    • 我想知道你为什么要为每个公共消息查询用户表到一个特定的服务器,你可以打电话给server.emit(...),请检查this
    • 这就是目标。我的问题与如何在添加到数据库的新服务器上执行 socket.join 有关,而无需监听数据库中的更改。阅读我帖子的结尾可能更清楚我原来的问题是什么。
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多