2012-08-24 64 views
4

處理在服務器上接收重複HTTP請求的方法是什麼?處理長時間運行的重複HTTP請求

我有一個LAMP網絡應用程序的報告,需要大約30秒來建立服務器並返回到客戶端。客戶不耐煩並在第一次完成之前再次運行報告。這沉沒了服務器。有什麼辦法來處理/防止這個服務器端?

+1

您可以預先生成報告過夜,然後只是鏈接到?如果客戶獲得他們自己定製的報告,這將不起作用,但如果每次都是相同的,它應該很好地工作。 – andrewsi

回答

3

存儲作業已在某處運行的事實。

在生成報告的代碼中,檢查一個是否已經在運行。如果是這樣,不要運行另一個。

當報告完成生成或某些超時過期以處理異常情況時,請取消存儲該事實。

你可以使用一個數據庫,分佈式緩存服務器,Redis的,文本文件,寫入共享內存...

1

你可以嘗試返回一個202響應,直到不管你正在構建的服務器上完成,然後提供它的緩存副本。

+1

503? 202也許...... – Bruno

+0

@布魯諾我的壞,它的202 –

1

現在,告訴用戶正在處理的東西往往是用AJAX完成的。

通常情況下,您會將請求發送到您的服務器,然後服務器會返回一個202響應和一個地址(可能帶有UUID),以便瀏覽器找到結果(您不一定直接顯示結果,但保留在腳本的後臺:您也可以直接爲不支持JavaScript的客戶端顯示此內容)。

然後,您將在後臺對該地址進行後續請求,並在準備就緒時顯示結果。

這種方法不僅具有更方便用戶的優勢,而且對斷開連接也更加強大。

0

30秒只是太長,讓用戶等待今天的網絡應用程序世界。谷歌搜索整個網絡的1/100時間。是什麼讓你的網絡應用程序更先進或消耗數據。如果您的一個實例即使在優化後仍無法處理它,您最好將其擴展到雲(或更多服務器)。如果真的如此苛刻,請將其分成可以在多個實例中並行運行的子任務。

對於你的直接問題,而不是你沒有問的問題的答案;上面的答案有一些技巧。您可以在它們發生之前生成頻繁請求的查詢 - 也可以僅向渲染髮出第一個請求,並在發送結果之前等待該請求完成。

+0

然而強大的電腦已經成爲,仍然有一些任務可能需要超過30秒才能完成,特別是因爲不是所有的東西都是完全可並行的。 「*擴展到雲*」聽起來像你一直在閱讀太多的營銷材料...... – Bruno

+0

或者你可以通過利用雲服務以更少的投資達到更高的峯值處理能力... – Clarence

+0

而且重點如果你想保留你的訪問者,你不能讓用戶等待那麼久。如果某些任務需要很長的處理時間,則需要將其轉換爲後臺服務,並且也可以被訪問者視爲網站的後臺工作。其他一切都將驅趕遊客,當然大多數請求將被取消。 – Clarence

相關問題