我目前正在为ArangoDB开发一个会话存储(connect-arango)。它的工作原理几乎与MongoDB会话存储相同(connect-mongo,因此是“connect-arango”),但问题是ArangoDB没有为其条目内置TTL。
MongoDB有这个,这不是问题。但是在ArangoDB中,我必须在会话存储中的某个地方这样做。
是否每60秒检查一次过期的会话(使用setlog)就足够了,或者我应该使用其他方法,比如每次调用“get”函数时都进行检查?
我会使用一个AQL查询来清除它们,类似于这样:
FOR s IN sessions
FILTER s.expires < DATE_NOW()
REMOVE s IN sessions
如果用户要清除他的cookie,则会话将永远不会使用“get”功能访问,这意味着我无法检查它是否已过期。
我能做的是,每次调用“get”函数时都运行上面的查询,但我认为这是完全不必要的,会给服务器带来更多的负载。
编辑:我知道如何清除过期的会话,只是不知道多久运行一次清除函数(在本例中,是上面的AQL查询)。
2条答案
按热度按时间0s0u357o1#
如果你在expires上设置一个skip-list索引,那么每60秒运行一次上面的查询应该不会产生任何问题。您还可以在ArangoDB中创建一个定期作业,每分钟运行一次此查询。
Alan Plum在ArangoDB中添加了一个Session Foxx应用程序,它基本上实现了上述所有内容。我不确定他是否已经发布了一份文件。API文档显示为
如果您对这个Foxx应用程序有任何疑问,请随时联系Alan,网址是hackers(at)arangodb.org
zqry0prt2#
从ArangoDB 2.3开始,Foxx附带了一个内置的会话应用程序,您可以在Foxx应用程序中使用。即使您不想使用Foxx,也可以重复使用会话应用程序。
您只需在选择的挂载点挂载会话应用的副本即可。这允许您配置会话TTL以及其他细节(例如,会话ID的长度)。该应用程序公开了一个HTTP API,允许您创建新会话、更新会话、检索现有会话并删除它们。它自动执行TTL(即删除过期的会话)。
目前,TTL仅在访问会话时强制执行。根据您的用例,这可能仍然会使过期会话的集合变得混乱。目前还不能直接在ArangoDB中调度重复性任务;有一个作业队列,但它不是一个很好的适合这种问题。这可能会在未来的ArangoDB版本中得到解决。
我建议您随着时间的推移监控会话应用程序挂载副本集合中堆积的过期会话数量。可能每周修剪一次过期的会话(甚至更少)就足够了。由于会话应用程序将自动删除过期的会话时,他们通过其API访问,唯一的问题是放弃的会话(例如,私人浏览模式或一次性用户)。
披露:我编写了ArangoDB 2.3中引入的新会话/认证应用程序。