2014-06-24 84 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

    對此有更多的想法。檢查編輯 –