Node.js、Socket.io 多用户应用程序——存储用户 session ?

标签 node.js express redis socket.io amazon-dynamodb

我正在构建一个 Node.js/Express 应用程序来处理(可能)多达数千个并发用户。他们将输入信息(存储在 DynamoDB 中),然后分配到不同的房间进行交互。我将使用 Socket.io 来捕获和发出用户在这些房间中进行的操作(例如聊天)。

问题

我不确定在用户浏览应用程序和登录/注销时跟踪用户的最佳方式。我们无法在服务器上存储他们的 session 数据(例如 room_id、user_settings),尤其是当服务器崩溃时。

我有两个想法可以使用一些建议:

  1. 直接从 DynamoDB 存储和检索 session 数据。如此频繁地访问数据库似乎会产生很高的开销。
  2. 使用像 Redis 这样的内存缓存,并在写入时刷新到 DynamoDB。我们需要在服务器崩溃的情况下保留数据。不确定这是否适用于成千上万的用户。

我是 DynamoDB 的新手,之前从未使用过 Redis,所以任何建议都会有所帮助。谢谢!

最佳答案

Redis 是必经之路。它的安装非常简单,并且有用于用户 session 的软件包,特别是如果您使用护照,例如 passport.socketio .它将获取身份验证数据并使用 sessionStore 将 session 存储在某处。

你并不真的需要那个插件来让它工作 - 你总是可以拥有自己的中间件,你可以在其中将 session 保存到某个商店。我能想到的足够快的选项是

  1. Redis
  2. 文件存储

文件存储意味着您将 session 保存为服务器上的文件,以便通过简单地读取文件而不进行数据库查询来最大程度地减少读取/写入时间,这会随着时间的推移而变得昂贵。每个文件都有其唯一的 ID,因此查询非常快。这里的缺点是很难维护 - 你会得到大量的文件夹和文件以及类似的东西

另一方面,Redis 专为此类事情而构建。它是一个内存存储,可以选择在本地保存数据(这意味着如果 Redis 服务器在某个时候死机,您可以恢复它)。它非常快速和高效,因为它在内存中。好处是它是一个单独的进程,你不必关心内存管理——你可以将它配置为使用特定数量,它会以你拥有最佳性能的方式处理所有信息(旧数据保存和输出内存不足时的内存)。

所以我的建议是不要太担心未知 - Redis 非常简单,您会在几个小时(或最多几天)内习惯它。

关于Node.js、Socket.io 多用户应用程序——存储用户 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32576818/

相关文章:

javascript - 无法读取未定义的属性 'undefined',但我确定 var 是有效的

python - 将 ORM 与 NoSQL 存储一起使用的不良做法?

magento - 在 EE 1.13 中,从管理员清除缓存实际上并没有清除缓存

python - Django 模拟补丁无法正常工作

javascript - 如何从nodeJS中的子文件中获取与父文件夹相同的目录中的文件的绝对路径

node.js - 表单保存 POST 操作未路由到 Express 中的路由器

node.js - 如何刷新 Smartcar 访问 token ?

javascript - Telegram Bot 付款 - 付款成功后显示收据

node.js - Node 集群 : How to assign separate server/port to each worker?

javascript - Node/ express 4 : displaying errors with express-validator on ajax post