这是维护用户状态(在线/离线)的标准方法吗

时间:2018-08-16 09:47:07

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

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

  1. 当用户登录socket.io连接时,会使用 节点应用
  2. node/socket.io应用中,我更新了{ 将套接字“ is_online”的事件设置为1
  3. 当用户注销或浏览器关闭或网络连接时 断开连接,此处触发了“ connection”,我再次更新了 “ disconnect”为0

它完美地工作。但是,当用户刷新浏览器时,服务器上的connect和offline事件触发两次更新数据库表。

我的问题是

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

我知道上一次活动的时间戳记,但这不是我的要求。 我也知道将ID保存在缓存中的技术,但是,这又不是我的要求。我想要的是“ 能够查询数据库中的在线和离线用户”

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

2 个答案:

答案 0 :(得分:0)

  

结合您可以做的事情,使其变得更加灵活和可扩展-

  • 请勿在数据库或RAM中使用在线用户状态
  • 您可以使用redis这样的存储空间
  • 记住10万用户在线时会发生什么情况
  

目前尚无固定的标准方法,但方法几乎相同,但更加成熟。

在频繁的套接字事件中涉及数据库查询对性能不友好,但是,如果您确实要将任何详细信息保存到db,则可以这样做。

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

答案 1 :(得分:0)

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

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

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