在rails中存储临时数据的位置

在Ruby中,我有一个控制器动作,可立即启动计算密集型任务,需要几秒钟。 我希望客户端轮询我的服务器并获取状态更新。

在我的控制器中:

def complex_task Thread.new do loop do one_part_of_the_computationally_intensive_task # Note how much progress we've made, in case the client asks. save_progress end end # returns to client straightaway, but task continues in background. end def check_status # Retrieve state in here. get_progress end 

请注意check_status如何拉出由单独线程存储的状态。

如何编写save_progressget_progress函数? 我在哪里存储州? 似乎将它存储在session并不是一个好主意,因为这会被发送到客户端,但我还能在哪里存储它?

(与这个问题有关 ,但更为一般。我期待完全不同的答案。)

看看delayed_job 。 您可以轻松地扩展它,以便作业可以将进度写入delayed_jobs表,以便随后通过check_status()方法提取(或者您甚至可以将set_status()check_status()到delayed_job ……)

请注意,delayed_job最初是从Shopify中提取的; 我猜这意味着它有一些可靠的真实曝光。 除非我有一个非常令人信服的理由,否则我宁愿从这样的基础开始而不是自己开始。

您可以将状态存储在模型中,并将status_id放入会话中。 或者,您可以使用数据库会话存储而不是基于cookie的存储,这将使您在服务器端放入会话的数据以牺牲会话速度为代价。