如何异步处理Rails观察者和回调(在不同的线程中)?

时间:2011-02-22 18:59:11

标签: ruby-on-rails callback observer-pattern

Rails模型上的观察者和回调函数在同一个线程上运行并阻止请求,直到它们返回。

例如,如果我有一个Photo模型并且我在after_create回调或观察者中排队调整大小的作业,那么在队列中输入一个条目之前请求就不会完成(如果我使用亚马逊,有时会很慢)排队的SQS)。

对于Rails控制器上的回调也是如此。如果我必须运行缓存管理或存储分析等维护,则在回调结束之前请求不会完成。

是否有Rails方法在回调(模型或控制器)中运行代码或在另一个线程中运行观察者,以便请求不会停止?

1 个答案:

答案 0 :(得分:2)

目前在请求/响应周期中在后台运行代码的两种常用方法是delayed_jobresque

delayed_job使用您的数据库排队后台处理作业,resque使用Redis。

我已经使用了两者并且它们都很好用,请阅读文档以了解哪种文档最适合您的情况。

这不会自动使你的观察者和回调在后台运行,但这样做很容易,甚至更多。这种技术非常普遍,生产在Rails社区进行了战斗。