2011-05-03 174 views
4

我有一個客戶端發送http請求來下載文件的場景。該文件需要動態生成,通常需要5-15秒。因此我正在研究一個解決方案,將這個操作分成3個http請求。用RabbitMQ獲取長時間運行任務的結果

  1. 第一個請求觸發生成該文件。
  2. 客戶端輪詢服務器每5秒檢查文件是否已準備好下載
  3. 當到輪詢請求的響應是積極的,在客戶端開始下載文件

要實現這一點,我很期待到像RabbitMQ這樣的Message Queue解決方案中。他們似乎提供了一個可靠的框架來異步運行長時間運行的任務。然而,在閱讀RabbitMQ上的tutorials後,我不確定我將如何收到操作結果。

這是我心中一直:

前端服務器接收來自客戶端的請求,並根據需要將其張貼消息的RabbitMQ。該前端服務器將具有3個端點

/generate 
/poll 
/download 

當客戶機調用/generateGET參數說request_uid=AAA,前端服務器將發佈消息的RabbitMQ與有效載荷中的request_uid。任何免費的工作人員隨後都會收到此消息並開始生成對應於AAA的文件。

客戶端將繼續輪詢/pollrequest_uid=AAA檢查任務是否完成。

當任務完成時,客戶端將調用/downloadrequest_uid=AAA希望下載文件。

問題是前端服務器的/poll/download處理程序將如何知道文件生成作業的狀態? RabbitMQ如何將任務結果傳回生產者。還是我必須在RabbitMQ之外實現這樣的機制? (消費者把它生成的文件/var/completed/AAA

回答

1

你擊中了要害你的最後一行:

(消費者把其導致 文件/ var /完成/ AAA)

您的服務器必須協調多個作業及其工作結果。因此,您需要某種形式的「主存儲庫」,其中包含已經完成的權限記錄。將完成的文件複製到一個特殊的目錄是一種合理而簡單的方法。

它不一定需要RabbitMQ或任何消息解決方案。您的服務器可以按照任何希望的方式爲這些工作人員提供工作:通過產生進程,使用線程池,或者實際上產生AMQP事件,這些事件最終發生在代理中,並被「工作」隊列消費者吸引。這取決於你的應用程序,最適合它的是什麼。

3

開始使用AMQP最簡單的方法是使用主題交換,並創建攜帶控制消息的隊列。例如,您可以使用file.ready隊列,並在文件路徑名已準備好提取時發送消息; file.error隊列可以在出於某種原因無法創建文件時進行報告。然後客戶端可以使用file.generate隊列將GET信息發送到服務器。