我们使用带有设计和 cancancan gem 的 Rails。我们的用户会话使用 ActiveRecord SessionStore 存储。
在我们的前端 (JavaScript) 代码中,我们最近开始使用 Web Worker 向我们的后端发出 Ajax 请求。这意味着这些请求不再与来自“主”线程的请求属于同一会话。
反过来,这意味着我们的数据库会话表会随着来自不需要保留的 web worker 请求的“临时”会话而快速增长。这些临时记录的增长速度远高于我们之前的增长速度,所以我们想摆脱这些不必要的记录。
我们可以在后端收到来自网络工作者的请求时识别它们。
删除不需要的记录的一种方法是
- 创建我们自己的 SessionStore 类并添加一个属性来指示特定会话的临时性质
- 有一个计划任务删除这些记录。
我们认为这是一个“B计划”。
我们希望在请求处理结束时删除临时会话。我们在应用控制器的 after_action 中添加了销毁会话的代码;
# application_controller.rb
after_action :clean_temporary_session
def clean_temporary_session
session.destroy if is_temporary_session?
end
这确实会导致会话记录的删除,但是,在删除记录后会立即创建一条新记录,因此记录的数量仍在不断增长。
我们如何在请求结束时删除临时会话记录?