【问题标题】:How can Rails observers and callbacks be handled asynchronously (in a different thread)?如何异步处理 Rails 观察者和回调(在不同的线程中)?
【发布时间】:2011-07-02 05:47:12
【问题描述】:

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

例如,如果我有一个照片模型,并且我在 after_create 回调或观察者中排队了一个调整大小的作业,则请求不会完成,直到在队列中输入一个条目(如果我使用亚马逊,这有时会很慢SQS 用于排队)。

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

是否有 Rails 方法可以在回调(模型或控制器)或不同线程中的观察者中运行代码,以免请求停止?

【问题讨论】:

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


    【解决方案1】:

    目前,在请求/响应周期之外在后台运行代码的几种流行方法是 delayed_job 和 resque

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

    我都用过,它们都很好用,请阅读文档,看看哪个最适合你的情况。

    这不会自动让您的观察者和回调在后台运行,但它可以很容易地做到这一点,等等。这种技术非常普遍,并且在 Rails 社区中经过了生产实战测试。

    【讨论】:

    • 谢谢,好主意。我使用 Amazon SQS 外包了delayed_jobs 或resque 的功能,这样我就不必在使用delayed_job 时不断地ping 我的数据库或在使用resque 时设置redis。 Amazon SQS 工作出色,但有时在重新连接到 SQS 服务器时会出现轻微延迟。
    • 还可以查看sidekiq,这是最快的,并且在您需要时提供商业支持。
    猜你喜欢
    • 2011-01-11
    • 2016-08-13
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多