2010-06-08 63 views
3

這是一個關於如何使Web應用程序能夠接收大量上傳數據,處理它並返回結果的一般設計問題,所有這些都沒有可怕的旋轉沙灘球5分鐘或可能的HTTP超時。AJAX:如何獲得Web應用程序的進度反饋,並避免長時間請求超時?

這裏的要求:

  • 使Web表單,您可以上傳包含URL
  • 當用戶點擊「提交」列表的CSV文件時,服務器獲取的文件,每個檢查看看它是否存在,以及頁面的標題標籤是什麼。
  • 結果是包含URL下載的CSV文件,並且將結果HTTP代碼
  • 輸入CSV可以非常大(> 100000行),所以取過程可能需要5-30分鐘。

到目前爲止,我的解決方案是在客戶端網站上有一個旋轉的JavaScript循環,每秒查詢服務器以確定作業的整體進度。這對我來說似乎很笨拙,我不願意接受這是最好的解決方案。我使用perl,模板工具包和jquery,但任何使用任何web技術的解決方案都是可以接受的。

編輯: 一個可能的解決方案的一個例子是這樣一個問題:How do I implement basic "Long Polling"?

+0

您是否需要從服務器發出請求?爲什麼不讓客戶做到這一點? – Alxandr 2010-06-08 23:58:32

+0

@alxandr,簡短的回答是我們進行這些http GET調用時所需的代理。客戶可能不被信任,以使其正確。 – 2010-06-09 00:14:44

+0

一個類似的問題,與長查詢示例代碼 http://stackoverflow.com/questions/333664/simple-long-polling-example-code – 2010-08-25 23:20:41

回答

3

爲此,您可以使用AJAX,但你可能會得到與像實施COMET更好的實時結果。我相信,COMET實現是專門設計來解決一些超時限制,但我沒有使用過,所以我不能提供直接指導。

無論哪種方式,我的建議是將工作交給另一個進程,一旦到達服務器。

我已經爲這種性質的批處理任務工作了許多不同的解決方案,而我最喜歡的是將批處理工作交給另一個進程。在這樣的系統中,上傳頁面將工作交給單獨的處理器,並立即返回用戶監控過程的指令。

批處理器可以在一對夫婦的方式來實現:

  • 叉子從IO脫離孩子完成批量處理。父級完成Web請求。
  • 將上傳內容保存到處理隊列(例如:文件系統上的文件,數據庫中的記錄),並讓Web服務器通知外部處理器 - 定製守護程序或現成調度程序,如「at」 * nix系統。

然後,您可以爲用戶提供多種方式來監控流程:

  • 上傳確認頁面包含批處理過程的同步實時監控(通過彗星或Flash)。完成確認頁面後,可以指導用戶下載。
  • 像上面那樣,但監視器不是實時的,而是通過AJAX或頁面元刷新使用定期輪詢
  • 一個隊列監視器頁面,顯示他們正在運行的任何批處理進程的狀態。

批處理器可以溝通它的狀態通過一些方法:

  • 更新的數據庫中的記錄
  • 生成處理日誌
  • 使用命名管道

把代碼交給另一個進程有很多好處:

  • 當用戶意外停止瀏覽器時,該過程將繼續。
  • 使用外部進程會強制您以允許您分離顯示器並隨時重新附加的方式傳送批處理狀態。例如:當用戶在過程完成之前意外導航離開頁面時。
  • 如果您決定需要在低網頁流量時間內分散批量處理,那麼實施批量限制和延期更容易。
  • 您不必擔心Web超時(客戶端或服務器端)。
  • 您可以重新啓動Web服務器而不必擔心是否中斷批處理。
+1

我希望避免一個輪詢方法,但它看起來像那樣可能不使用閃存或其他字節碼。 – 2010-06-09 21:15:07

1

最簡單的方法是批量處理,甚至是流式傳輸工作。如果你把它看作你網頁上的數據表。如果該表具有> 100000條記錄,那麼您只需要一次請求所有記錄。我會這樣做:

  1. 發送請求下載文件。

  2. 發送處理請求100(任意數字)記錄。

    a。過程記錄。

    b。保存到臨時的csv文件。

    c。響應返回狀態完成/未完成過程。 d)。如果狀態爲未完成重複第二步。

0

你提到的客戶端不能被信任,所以我建議(在客戶端)預解析每記錄X號文件,附加一個校驗和記錄每一個子集,則允許客戶端通過代理上傳固定數量的連接,以便更準確地監控進度。