2015-11-26 71 views
4

我有以下要求。我正在創建一個Web應用程序(無前端),它將接收帖子並獲取請求。它的功能如下。客戶將在URL上發佈帖子,觸發大量耗時的任務。客戶還可以進行獲取請求並檢索獲取結果。更新客戶端,芹菜任務已完成

我正在考慮使用芹菜開始任務。該任務是一個非常大的算術計算。我的問題是如何通知客戶他觸發的任務已完成,他可以檢索結果。

所以我想這樣的:

client ->posts to web app -> web app starts task to celery -> request closed 

web app notifies -> client triggered task # what is the proper way 

client -> get request to web app -> web app returns result 

我知道有沒有一個正確的方法,所以我會成爲一個更具體一點。目前,任務將由另一個瓶子應用程序自動觸發。有沒有一種方法可以自動通知燒瓶應用程序完成任務並獲取結果並將它們存儲在自己的數據庫中?第二個問題什麼是最通用的解決方案,即使客戶端是燒瓶應用程序,Android應用程序和IOS應用程序等,也可以工作。

我也問過的原因是因爲我曾經討論過api將結果發回給客戶或客戶應負責檢查並獲得結果。

回答

5

我不得不在過去作出類似的決定,在一個長期運行的芹菜任務完成後客戶端需要更新。有許多不同的方式來設計系統來解決這個問題:

  1. 狀態端點與輪詢 - 這是最簡單的解決方案。在燒瓶中公開一個終點,它返回一個工作的狀態,並簡單地從客戶端輪詢。然而,有幾點需要注意,即客戶數量和投票頻率。如果您的客戶太多或輪詢頻率過高,則可能會遇到性能問題。如果你有幾個客戶,並且不需要即時的狀態更新,這是理想的。
  2. WebSockets - 打開客戶端和服務器之間的WebSocket,並使用它在您的任務完成時推送更新。這種方法可以更好地滿足多個客戶的需求,並且可以提供近乎即時的通知
  3. 回調URL - 您提到客戶端是Flask應用程序。您可以在客戶端服務器上公開一個回調路由,並在啓動任務時將其提供給芹菜。任務完成後,Celery可以POST到回調URL,並通知客戶端。

至於最通用的解決方案,這將是兩種狀態端點或WebSockets的 - Android電子&的iOS內置有斷點續傳功能,並且可以使用庫處理的WebSockets。另一方面,回調URL解決方案特定於Flask。