【问题标题】:Is this a standard way to maintain users' status (online/Offline)这是维护用户状态(在线/离线)的标准方式吗
【发布时间】:2019-01-23 05:48:27
【问题描述】:

我有一个用 Vuejs、Laravel 和 Nodejs 编写的实时社交网络 Web 应用程序。 我有查询要获取在线用户,例如“select * from users where is_online=1” 请不要建议我不要保留这面旗帜,我真的需要这面旗帜。 要在数据库中更新此标志,我执行以下操作

  1. 当用户登录 socket.io 连接时,使用 节点应用
  2. node/socket.io 应用程序中,我更新了 is_online 标志 套接字“connection”事件为 1
  3. 当用户注销或浏览器关闭或网络连接时 断开连接,“disconnect”在这里触发,我再次更新 "is_online" 为 0

完美运行。但是,当用户刷新浏览器时,服务器上的连接和断开连接事件会触发两次更新数据库表。

我的问题是

  1. 这是实时确定用户状态的标准方法吗?
  2. 做这些事情的行业标准是什么?

我知道最后一个活动时间戳的事情,但这不是我的要求。 我也知道将 id 保存在缓存中的技术,但是,这又不是我的要求。我想要的是'能够查询数据库的在线和离线用户'

任何知识都受到高度赞赏。

【问题讨论】:

    标签: node.js laravel sockets socket.io real-time


    【解决方案1】:

    使用 JSON 文件存储用户活动,并使用 JSON 文件更新数据库表。

    创建一个 active-users.JSON 文件,每当新用户登录(已建立套接字连接)、注销(已断开套接字连接)或什至重新加载浏览器时,都会写入该文件 JSON 文件会更新两次,因此这不会向数据库创建两个不必要的请求。

    然后你可以使用 Laravel 控制台命令内核每隔 30 秒或 1 分钟读取一次 JSON 文件,以读取数据。如果发现数据有任何变化,请相应地更新数据库。

    【讨论】:

    • 这会导致频繁读取/写入文件,这再次导致系统失败@Jagadeesh
    • 如果您不想频繁读取/写入 JSON 文件,您可以创建一个全局数组并在新连接发生或浏览器关闭或重新加载时添加/删除用户。这样一来,您始终可以在任何给定时间连接用户。
    【解决方案2】:

    您可以做一些事情来使其更加灵活和可扩展 -

    • 不要在数据库或 RAM 中使用在线用户状态
    • 您可以使用 redis 之类的存储来做到这一点
    • 记住当 10 万用户在线时会发生什么

    这样做没有固定的标准方式,但方式几乎相同,但更成熟。

    在频繁的套接字事件中涉及数据库查询对性能不友好,但是如果你真的想将任何细节保存到数据库,你可以这样做。

    我已经开发了一个具有相同概念的应用程序(有时会达到 40-50K 在线用户),效果非常好。

    【讨论】:

    • 在redis的情况下,正如我解释的那样,我可以查询在线用户的数据库。想法?
    • 不,它以另一种方式和更简单的方式工作。对于一个简单的示例,您可以存储一组 allOnlineUsersId 和一个数组 userSocketIds 来存储每个用户的 socketIds。因此,您只需一次单例操作即可获取所有用户、用户的 socketId 或来自 socketId 的 userId,如果考虑每分钟有 10K 用户在线/离线,这比查询数据库要好得多。
    • 用户通过“当前用户好友”、“性别”等参数查询。
    • 你能举个例子吗? @rahul
    • 对,所以您将首先从 db 收集用户和所需数据,现在您拥有所有 id,因此您可以从 redis 获取它们的状态。因此,目标是避免/删除由于套接字而在 db 上频繁出现的 CRUD。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多