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

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

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

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

我每5秒左右轮询一次。

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

非常感激

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

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

  1. 使用例如sidekiq开始后台搜索工作
  2. 为内存存储(如redis)中的每个搜索请求缓存部分结果
  3. 民意调查结果来自redis

另一个选择可能是将消息传递问题转移到事务服务器。 Evented Servers不会在每个连接上产生一个单独的线程,无论是否长寿。

Faye是一款与轨道完美集成的服务器。 程序将是:

  1. 客户订阅Faye消息频道
  2. 客户提供seach
  3. 搜索在后台工作中执行(sidekiq)
  4. 后台工作定期在同一个Faye频道上发布部分结果

实际上,pumamultithreading设置旨在阻止您完成所有这些操作。 我只想增加系统允许的线程数和进程数,看看它是如何执行的。 添加更多RAM或一些额外的服务器总是更便宜,并允许您专注于其他function。

与王菲交流

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

  1. 在相同或不同的计算机上部署应用程序两次
  2. 为具有SSE的搜索查询配置nginx路由/负载平衡到一个应用程序实例
  3. 配置为第二个实例提供应用程序的其余部分
  4. 您的应用逻辑没有任何改变
  5. 利润

你甚至可以完全抛弃民意调查而只是坚持SSE