2014-06-24 43 views
2

我正在使用外部服务来执行搜索我的应用程序。需要错开消耗的外部API的轨道消耗

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

因为当我有新的结果时,我将这些通过SSE转移到客户端。

我每5秒左右轮询一次。

我应该如何运行这个过程,而不会让我的一个线程在90秒内运行(运行puma + nginx)。我需要保持控制器的状态,以将SSE推送给请求客户端,并且我不确定处理轮询之间延迟的最佳方式。

大加赞赏

回答

1

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

不过,如果你只想做的,你可以使用下面的策略部分结果查询:有一个在 - 在每个搜索请求例如sidekiq

  • 缓存部分结果

    1. 启动后台搜索工作内存存储喜欢的Redis
    2. 从Redis的

    另一种选择可能是移动通讯问题的事件触发服务器投票结果。 Evented Servers不会在每个连接上产生一个单独的线程,无论是否长期存在。 Faye是一个与轨道完美集成的服务器,这是一个完美的服务器。过程将是:

    1. 客户所预订上Faye的消息信道
    2. 客户intiates SEACH
    3. 搜索内的后台作业(sidekiq)
    4. 后台作业定期发布上相同Faye的信道
    部分结果进行

    其实美洲狮多线程设置意图阻止你通过所有这些。 只要系统允许,我只会增加线程数和进程数,并查看其执行方式。添加更多内存或一些额外的服务器总是更便宜,并允许您专注于其他功能。

    Messaging with Faye

    编辑1 反思什么实际上是朝着后台作业搜索的好处。Sidekiq也有自己的线程池,sidekiq线程与puma线程没有区别。无论如何,搜索任务必须完成。它的线程将在大部分时间暂停,为IO提供服务。所以,上述2个解决方案的唯一好处是适当的资源平衡。它允许您定义搜索作业将使用多少个线程,以及您的应用服务器有多少个线程。那么,怎么样以下策略:

    1. 与SSE搜索查询
    2. 配置nginx的路由/负载均衡部署应用程序两次相同或不同的机器上的一个应用实例
    3. 配置服务应用到其他二审
    4. 有没有你的应用程序逻辑的一件事改变了
    5. 利润

    你甚至可以从头并完全投票,只是坚持SSE

  • +0

    谢谢,这是伟大的。我想我应该像你说的那样做,并且现在要扩大我的资源。然后计划在接下来的几个月内迁离上交所。再次感谢。 – RMcNairn

    +0

    对此有更多的想法。检查编辑 –