2011-02-22 40 views
5

Observers and Callbacks on Rails模型在同一个线程上运行并阻塞请求直到它们返回。例如,如果我有一个Photo模型,并且在after_create回调或观察者队列中调整大小的作业,那么请求将不会完成,直到在队列中创建一个条目(如果我正在使用,则有时会很慢用于排队的Amazon SQS)。如何异步处理Rails观察者和回调(在不同的线程中)?

对于Callbacks on Rails控制器同样适用。如果我必须执行维护(如缓存管理或商店分析),请求将在回调结束之前完成。

是否存在Rails方式在回调(模型或控制器)或不同线程中的观察者内部运行代码,以便请求不会停滞?

回答

2

一对夫妇的流行的方式在后台运行的代码出了请求/响应周期的目前delayed_jobresque

delayed_job的使用数据库来排队后台处理工作,并resque使用Redis的。

我已经使用它们,它们都很好,阅读文档以查看哪些可能最适合您的案例。

这不会自动让您的观察者和回调在后台运行,但它使得执行该操作变得相当容易,等等。这项技术非常普遍,在Rails社区中进行生产战斗。

+0

谢谢,好主意。我使用Amazon SQS将delayed_jobs或resque的功能外包出去,以便在使用resque时使用delayed_job或设置redis时不必一直ping我的数据库。亚马逊SQS的工作非常出色,但有时在重新连接到SQS服务器方面存在一些小的延迟。 – Sid 2011-02-22 19:47:36