gpt4 book ai didi

ruby-on-rails - 延迟阻塞 Rails 请求

转载 作者:行者123 更新时间:2023-12-04 06:22:22 24 4
gpt4 key购买 nike

我找到了a question that explains how Play Framework's await() mechanism works在 1.2 中。本质上,如果您需要做一些会阻塞一段可测量时间的事情(例如,发出一个缓慢的外部 http 请求),您可以暂停您的请求并让该工作人员在阻塞时释放它以处理不同的请求。我猜一旦您的阻塞操作完成,您的请求就会重新安排以继续处理。这与在后台处理器上安排工作然后让浏览器轮询完成不同,我想阻止浏览器而不是工作进程。

不管我对 Play 的假设是否真实,是否有一种技术可以在 Rails 应用程序中做到这一点?我想人们可以认为这是一种长轮询形式,但除了“使用节点”之外,我没有找到关于该主题的太多建议。

最佳答案

我有一个类似的问题,关于阻止 worker 接受其他请求的长请求。这是所有 Web 应用程序的问题。即使是 Node.js 也可能无法解决在 worker 上花费太多时间的问题,或者可能只是内存不足。

我工作的一个 web 应用程序有一个 web 接口(interface),它向 Rails REST API 发送请求,然后 Rails Controller 必须请求一个 Node REST API,该 API 运行繁重的耗时任务来取回一些数据。从 Rails 到 Node.js 的请求可能需要 2-3 分钟。

我们仍在尝试寻找不同的方法,但也许以下方法对您有用,或者您可以调整一些想法,我也很想得到一些反馈:

  • 前端在同一 session 中使用生成的标识符 [A] 向 Rails API 发出请求。 (此标识符有助于识别来自同一用户 session 的先前请求)。
  • Rails API 将前端请求和标识符 [A] 代理到 Node.js 服务
  • Node.js 服务将此作业添加到队列系统(例如 RabbitMQ 或 Redis),消息包含标识符 [A]。 (这里要根据自己的场景来考虑,也假设系统会消费队列作业并保存结果)
  • 如果再次发送相同的请求,根据要求,您可以使用相同的标识符 [A] 终止当前作业并调度/排队最新请求,或者忽略等待第一个完成的最新请求,或其他决定适合您的业务需求。
  • Front-end 可以发送间隔 REST 请求来检查标识符为 [A] 的数据处理是否完成,那么这些请求是轻量级和快速的。
  • 一旦 Node.js 完成工作,您可以使用消息订阅系统或等待下一个检查状态请求并将结果返回给前端。

  • 您还可以使用负载均衡器,例如亚马逊负载均衡器, Haproxy . 37signals有一个 blog post and video关于使用 Haproxy 来卸载一些不会阻塞较短请求的长时间运行的请求。

    Github 使用类似的策略来处理生成提交/贡献可视化的长请求。他们还设定了拉动时间的限制。如果时间太长,Github 会显示一条消息,说时间太长,已被取消。

    YouTube 有一条关于较长排队任务的好消息:“这比预期花费的时间长。您的视频已排队,将尽快处理。”

    我认为这只是一种解决方案。也可以看看 EventMachine gem,这有助于提高性能,处理并行或异步请求。

    由于此类问题可能涉及一项或多项服务。考虑提高这些服务(例如数据库、网络、消息协议(protocol)等)之间性能的可能性,如果缓存可能有帮助,请尝试缓存频繁的请求,或预先计算结果。

    关于ruby-on-rails - 延迟阻塞 Rails 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6396426/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com