2011-09-28 43 views
1

假設一個操作可能需要2到10分鐘才能在服務器上執行,例如更新耗時的索引。如果您在服務器執行耗時操作時持有HTTP請求?或讓請求去?

您會在執行請求時執行操作嗎?即在操作完成之前不發送HTTP響應?如果客戶端/瀏覽器放棄請求,只需繼續操作?

什麼是替代方案?啓動手術,並以「長時間手術啓動」作爲迴應?如果該操作在中途未能成功,客戶會如何知道?保持操作的服務器端「狀態」?

感謝

回答

3

您也可能使用分塊響應。首先,用一些可以顯示「請稍候」屏幕的代碼推入塊,刷新響應並開始工作。然後,您可以通過定期進度更新來推送和沖洗塊,或者只需在最後輸入一個「已完成」信息。很明顯,你可以使用JavaScript來獲得一個不錯的用戶界面。

(如果你使用WSGI作爲第一WSGI規範寫在使用未知長度的反應塊,以便用分塊的響應存在是不可能的辦法以上不適用。)

+0

。內容豐富,謝謝。 – rapadura

0

會同時舉行的要求執行的操作?即在操作完成之前不發送HTTP響應?

您的用戶期望什麼?

如果客戶端/瀏覽器丟棄了請求,只需繼續操作?

您的用戶期望什麼?

什麼是替代方案? 啓動操作,並以「長時間操作啓動」響應?

你還能做什麼?忽略請求?假裝它沒有發生?很明顯,你通知他們。

如果操作在中途失敗,客戶該怎麼知道該怎麼辦? 維護操作的服務器端「狀態」?

有什麼替代?魔法?直覺?顯然,你必須保持狀態。並顯示狀態。

閱讀celery

+0

啊芹菜很好。謝謝。我明白了,阿哈, – rapadura

2

如果有需求,你知道需要很長時間(超過幾秒)來處理,您必須至少假設該連接可能被防火牆強行切斷。

我會說你應該在後端實現一個隊列系統。請求執行操作成爲請求隊列的操作。當操作實際完成後,您可以等待客戶端進行輪詢,或主動以某種方式通知他們。對於瀏覽器,您幾乎不得不輪詢或發送電子郵件。

+0

我希望我能接受幾個答案。 – rapadura