Rails消耗外部API需要交错消费

时间:2014-06-24 09:21:47

标签: ruby-on-rails ruby multithreading performance concurrency

我正在使用外部服务来搜索我的应用程序。

此搜索的结果需要从多个合作伙伴处收集,需要10到90秒才能完成。在收集结果的同时,我反复轮询我的搜索会话以收集已经准备好的结果。

当我有新的结果时,我会通过SSE将它们转移到客户端。

我每隔5秒左右进行一次投票。

我如何运行这个过程而不用绝对地训练我的一个线程90秒(运行puma + nginx)。我需要保持我的控制器状态,将SSE推送到请求客户端,并且不确定处理民意调查之间延迟的最佳方法。

非常感谢

1 个答案:

答案 0 :(得分:1)

如果你真的想释放线程,你必须放弃SSE。为了接收SSE,浏览器保持与web服务器的长期连接,并且在puma的情况下,每个客户端连接将由单独的线程处理。

但是,如果您只想对部分结果进行轮询,可以使用以下策略:

  1. 使用例如sidekiq
  2. 开始后台搜索工作
  3. 为内存存储中的每个搜索请求缓存部分结果,例如redis
  4. 来自redis的投票结果
  5. 另一个选择可能是将消息传递问题转移到事务服务器。无论长期存在与否,Evented Servers都不会在每个连接上产生单独的线程。

    与Faye完美集成的一个这样的服务器就是Faye。程序将是:

    1. 客户订阅Faye消息频道
    2. 客户启动搜索
    3. 搜索在后台作业(sidekiq)中执行
    4. 后台作业定期在同一个Faye频道上发布部分结果
    5. 实际上,puma多线程设置旨在阻止您完成所有这些操作。 我只想增加系统允许的线程和进程数量,看看它是如何执行的。添加更多内存或一些额外的服务器总是更便宜,并允许您专注于其他功能。

      Messaging with Faye

      修改1 重新思考在后台工作中移动搜索实际上会带来什么好处。 Sidekiq也拥有它自己的线程池,而sidekiq线程与puma线程没有区别。无论如何都必须完成搜索任务。它的线程将在大多数时间暂停,为IO做好准备。因此,上述两种解决方案的唯一好处是适当的资源平衡。它允许您定义将用于搜索作业的线程数以及应用服务器的线程数。那么,如何遵循策略:

      1. 在相同或不同的计算机上部署应用程序两次
      2. 为使用SSE的搜索查询配置nginx路由/负载平衡到一个应用实例
      3. 将应用程序的其余部分配置为第二个实例
      4. 您的应用逻辑没有任何改变
      5. PROFIT
      6. 你甚至可以完全抛弃民意调查并坚持使用SSE