NodeJS自定义会话存储,清除过期的会话

我目前正在为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 

如果用户要清除他的cookies,那么会话永远不会被使用“get”函数访问,这意味着我无法检查它是否已经到期。

但是我能做的是在每次调用“get”函数的时候运行上面的查询,但是我觉得这样做是不必要的,并且会增加服务器的负担。

编辑:只要没有人误解,我知道如何清除过期的会话,我只是不知道如何经常运行清除function(在这种情况下,这是上面的AQL查询)。

如果您在跳过列表中使用skip-list索引,则每60秒运行一次上述查询就不会产生任何问题。 您也可以在每分钟运行一次这个查询的ArangoDB中创build一个定期的作业。

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

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

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

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

您可以简单地在您select的挂载点上挂载会话应用程序的副本 。 这允许您configuration会话TTL以及其他详细信息(例如会话ID的长度)。 该应用程序公开了一个HTTP API,它允许您创build新的会话,更新会话,检索现有会话并删除它们。 当您尝试检索或更新会话时,它会自动执行TTL (即删除过期的会话)。

目前只有在访问会话时才会执行TTL。 根据您的使用情况,这可能仍然会导致收集过期的会话混乱。 目前无法在ArangoDB中直接安排重复任务; 有一个工作队列,但它不适合这种问题。 这可能会在未来的ArangoDB版本中解决。

我会build议随着时间的推移监控会话应用程序的已装载副本的累积过期会话的数量。 每周 (或更less) 修剪已过期的会话可能就足够了 。 由于会话应用程序会在通过API访问会话时自动删除过期会话,唯一的问题是被放弃的会话(例如隐私浏览模式或一次性用户)。

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