2016-07-15 61 views
0

我有用戶加載特定頁面時調用的Rails控制器。控制器撥打第三方網絡服務。但是,當Web服務關閉時,我的Rails控制器會掛起。我無法導航到其他頁面,註銷或刷新頁面......所有這些任務都等待Web服務調用在執行之前完成。如果Web服務調用從未完成,則必須重新啓動我的Rails應用程序才能使其再次啓用。如何防止Rails控制器在進行Web服務調用時掛起

有沒有防止這種情況發生的標準方法?我正在使用Faraday gem來進行Web服務調用。我想我可以在進行Web服務調用時設置超時值。但是,理想情況下,我希望任何導航到另一個頁面的用戶操作立即停止此Web服務調用。這可能嗎?

+0

什麼是您使用的機架實施服務器? –

+0

@AmirRaminfar我不確定我正在使用哪種機架實現。你碰巧知道如何檢查這個? – kales33

+1

如果你不知道,那麼你可能使用Webrick,它是Rails中的默認服務器。你不應該在生產中使用它。 –

回答

1

我相信會發生這種情況,因爲您可能正在使用一次只能處理一個請求的Rack Web實現。獨角獸就像是事件驅動的地方。非常像Node。你應該考慮首先解決這個問題。所以如果你使用法拉第,你可以做一些像req.options.timeout = 5這樣的超時。

然後我推薦使用彪馬。如果這不是一個選項,您應該調整您的服務器設置,以便一次允許多個連接。對於獨角獸,我相信它是worker_processes

+1

值得注意的是,使用多線程/多進程服務器不會阻止控制器的掛起動作。這只是其他工作人員將在那裏處理其他請求,與掛起的請求並行。因此,在訪問該行動時,所有工作人員都有可能被吊死。 –

+1

是的,這是一個很好的觀點。值得指出的是,根據負載情況,有多少線程可用並不重要。在某些時候,系統會降低性能。 –

+0

謝謝AmirRaminfar和@NicNilov的快速回復!根據你所說的話,它看起來像是爲法拉第設置了一個超時值,並且使用不同的Rack實現將會使用戶的體驗更好。感謝您的想法! – kales33

相關問題