NodeJS自定义session Store,清除过期session

问题描述 投票:0回答:2

我目前正在为 ArangoDB (connect-arango) 开发一个会话存储。它的工作原理几乎与 MongoDB 会话存储(connect-mongo,因此为“connect-arango”)相同,但问题是 ArangoDB 没有为其条目内置 TTL。

MongoDB 有这个,而且这不是问题。但在 ArangoDB 中,我必须在会话存储中的某个地方执行此操作。

每 60 秒检查一次过期会话(使用 setTimeout)是否足够,或者我应该使用其他方法,例如每次调用“get”函数时进行检查?

我会使用 AQL 查询来清除它们,类似于:

FOR s IN sessions
  FILTER s.expires < DATE_NOW()
  REMOVE s IN sessions

如果用户要清除他的cookie,则永远不会使用“get”功能访问会话,这意味着我无法检查它是否已过期。

但是,我可以做的是每次调用“get”函数时运行上述查询,但我认为这是完全没有必要的,并且会给服务器带来更多负载。

编辑:为了没有人误解,我知道如何清除过期的会话,我只是不知道运行清除功能的频率(在本例中,是上面的 AQL 查询)。

node.js session store arangodb node.js-connect
2个回答
2
投票

如果您将跳表索引设置为过期,则每 60 秒运行一次上述查询应该不会产生任何问题。您还可以在 ArangoDB 中创建一个定期作业,每分钟运行此查询。

Alan Plum 在 ArangoDB 中添加了一个会话 Foxx 应用程序,它基本上实现了上述所有功能。我不确定他是否已经发布了文档。 API 文档可见为

localhost:8529/_db/_system/_admin/aardvark/standalone.html#!/sessions

如果您对此 Foxx 应用程序有任何疑问,请随时联系 hackers (at) arangodb.org 的 Alan


0
投票

从 ArangoDB 2.3 开始,Foxx 附带了一个内置会话应用程序,您可以在 Foxx 应用程序中使用。即使您不想使用 Foxx,也可以重复使用会话应用程序。

您只需在您选择的挂载点挂载会话应用程序的副本即可。这允许您配置会话 TTL 以及其他详细信息(例如会话 ID 的长度)。该应用程序公开了一个 HTTP API,可让您创建新会话、更新会话、检索现有会话并删除它们。当您尝试检索或更新会话时,它会自动强制执行 TTL(即删除过期的会话)。

目前,仅在访问会话时才强制执行 TTL。根据您的用例,这可能仍然会使过期会话的集合变得混乱。目前无法直接在 ArangoDB 内安排重复任务;有一个作业队列,但它不太适合此类问题。这可能会在 ArangoDB 的未来版本中得到解决。

我建议随着时间的推移监控会话应用程序安装副本集合中堆积的过期会话数量。每周修剪一次过期会话可能就足够了(甚至更少)。由于会话应用程序在通过其 API 访问时会自动删除过期的会话,因此唯一的问题是废弃的会话(例如私人浏览模式或一次性用户)。

披露:我编写了 ArangoDB 2.3 中引入的新会话/身份验证应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.