Rails消耗外部API需要交错消费
我正在使用外部服务来搜索我的应用程序。
此搜索的结果需要从多个合作伙伴处收集,并需要10到90秒才能完成。 在收集结果的同时,我反复轮询我的搜索会话以收集已经准备好的结果。
当我有新的结果时,我会通过SSE将它们转移到客户端。
我每5秒左右轮询一次。
我怎么能运行这个过程而不用绝对地训练我的一个线程90秒(运行puma + nginx)。 我需要保持我的控制器状态,将SSE推送到请求客户端,并且不确定处理民意调查之间延迟的最佳方法。
非常感激
如果你真的想释放线程,你必须放弃SSE。 为了接收SSE,浏览器保持与web服务器的长期连接,并且在puma的情况下,每个客户端连接将由单独的线程处理。
但是,如果您只想对部分结果进行轮询,则可以使用以下策略:
- 使用例如sidekiq开始后台搜索工作
- 为内存存储(如redis)中的每个搜索请求缓存部分结果
- 民意调查结果来自redis
另一个选择可能是将消息传递问题转移到事务服务器。 Evented Servers不会在每个连接上产生一个单独的线程,无论是否长寿。
Faye是一款与轨道完美集成的服务器。 程序将是:
- 客户订阅Faye消息频道
- 客户提供seach
- 搜索在后台工作中执行(sidekiq)
- 后台工作定期在同一个Faye频道上发布部分结果
实际上,pumamultithreading设置旨在阻止您完成所有这些操作。 我只想增加系统允许的线程数和进程数,看看它是如何执行的。 添加更多RAM或一些额外的服务器总是更便宜,并允许您专注于其他function。
与王菲交流
编辑1重新思考在后台作业中移动搜索的实际好处。 Sidekiq也拥有自己的线程池,而sidekiq线程与puma线程没有区别。 无论如何必须完成搜索任务。 它的线程将在大多数时间暂停,为IO做好准备。 因此,上述两种解决方案的唯一好处是适当的资源平衡。 它允许您定义将用于搜索作业的线程数以及应用服务器的线程数。 那么,遵循策略如何:
- 在相同或不同的计算机上部署应用程序两次
- 为具有SSE的搜索查询配置nginx路由/负载平衡到一个应用程序实例
- 配置为第二个实例提供应用程序的其余部分
- 您的应用逻辑没有任何改变
- 利润
你甚至可以完全抛弃民意调查而只是坚持SSE