【问题标题】:A way to hand off a Rail connection to delayed_job一种将 Rail 连接移交给 delay_job 的方法
【发布时间】:2011-09-02 01:17:53
【问题描述】:

我们有一个现有的 API,客户端向我们的服务器询问我们必须从另一个外部服务器获取的信息。当外部服务器需要很长时间(例如 10 秒)时,它会在整个 10 秒内保持一个 Rails 乘客实例。

有没有办法将我们的回复渲染传递给delayed_job,以便我可以释放Rails 实例?

注意:理想情况下,我们会更新我们的 API 并回复我们的 API 客户端我们很忙,并在几秒钟后重试,看看我们是否准备好了。然而,那里已经有成千上万的客户,现在改变他们是不切实际的。

【问题讨论】:

    标签: ruby-on-rails delayed-job


    【解决方案1】:

    处理这个问题的常用方法是将作业排队并立即返回,然后轮询或使用一些异步通知框架(如 Pusher 或 Faye)来更新远程客户端。您绝对不能像您描述的那样将连接传递给 DJ。您可能会调查的另一个途径是使用 EventMachine 来处理它,例如 http://railstips.org/blog/archives/2011/05/04/eventmachine-and-passenger/。第三种选择是预先缓存来自远程 Web 服务的数据,但这是一个非常依赖于您正在做什么的途径(例如,授权不是您可以在那里做的事情。)

    基本的底线是您正在处理一些架构问题。如果您绝对必须与远程服务对话并在请求周期中输出结果,那么除了更改为 EventMachine 或 Node.js 等事件较多的后端之外,您无能为力。

    【讨论】:

    • 顺便说一句,你不能做你所要求的技术原因是你的 DJ 工作人员在另一个进程中运行(否则它会阻止你的请求,这就是你正在处理的现在),并且您不能跨进程边界共享连接。
    • 感谢您的帮助。只是好奇。谁说您“不能跨流程边界共享连接”? Linux? NGINX?乘客?架子?其他?
    • 我想我会说它是操作系统级别的东西。对于大多数操作系统来说,这个进程包含了它可以访问的所有内存。看看可以用共享内存空间做什么可能会很有趣,但我还不够了解操作系统级别的极客,TBH。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2012-11-18
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多