我正在使用外部服务来搜索我的应用程序。
此搜索的结果需要从多个合作伙伴处收集,需要10到90秒才能完成。在收集结果的同时,我反复轮询我的搜索会话以收集已经准备好的结果。
当我有新的结果时,我会通过SSE将它们转移到客户端。
我每隔5秒左右进行一次投票。
我如何运行这个过程而不用绝对地训练我的一个线程90秒(运行puma + nginx)。我需要保持我的控制器状态,将SSE推送到请求客户端,并且不确定处理民意调查之间延迟的最佳方法。
非常感谢
答案 0 :(得分:1)
如果你真的想释放线程,你必须放弃SSE。为了接收SSE,浏览器保持与web服务器的长期连接,并且在puma的情况下,每个客户端连接将由单独的线程处理。
但是,如果您只想对部分结果进行轮询,可以使用以下策略:
另一个选择可能是将消息传递问题转移到事务服务器。无论长期存在与否,Evented Servers都不会在每个连接上产生单独的线程。
与Faye完美集成的一个这样的服务器就是Faye。程序将是:
实际上,puma多线程设置旨在阻止您完成所有这些操作。 我只想增加系统允许的线程和进程数量,看看它是如何执行的。添加更多内存或一些额外的服务器总是更便宜,并允许您专注于其他功能。
修改1 重新思考在后台工作中移动搜索实际上会带来什么好处。 Sidekiq也拥有它自己的线程池,而sidekiq线程与puma线程没有区别。无论如何都必须完成搜索任务。它的线程将在大多数时间暂停,为IO做好准备。因此,上述两种解决方案的唯一好处是适当的资源平衡。它允许您定义将用于搜索作业的线程数以及应用服务器的线程数。那么,如何遵循策略:
你甚至可以完全抛弃民意调查并坚持使用SSE