我在Google App Engine(Python)上運行一個實驗性應用程序,它由一個API和一個執行一些長時間運行任務的Worker組成。管理Google App Engine中的長時間運行任務
API是一個具有云端點的標準模塊,Worker是ManagedVM模塊。
用戶在數據庫上創建一個任務,它將其作爲任務放在拉隊列中。工人通過延長租約來完成這項任務並無限地執行它。工作人員還將設置數據庫任務的狀態(例如「正在運行」或「錯誤」)。
的目標是在用戶再次停止它永遠執行任務。我通過將狀態設置爲「停止」並在Worker上調用處理程序來停止任務(workerUrl保存到任務模型)來實現此目的。工作人員然後將狀態設置爲「停止」並刪除其租用的任務。
這個工作到目前爲止有一些小問題(例如,把任務兩次)。但我想知道是否有更好的方法來應對這一挑戰?基本上問題是如何使遠程工作人員執行與數據庫模型同步。
另外我也有問題,如果我停止應用程序的任務應根據他們的狀態放回隊列(可以有意停止)。在現場服務器上,這不是什麼大問題,因爲應用程序基本上不會停止,但在開發服務器上是這樣。也許這適用於cron工作?
更新1:
有關任務的信息實際上是存儲在數據庫中。隊列上的任務包含數據庫上模型的ID,請注意,圖中狀態在api上得到更新。
工作者(MVM)和API之間的通信通過我在工作端使用python客戶端的雲端點發生。這工作相當可靠。
這是真的,爲避免重複的任務,我應該使用任務名稱。我遇到的唯一問題是,你不能重複使用相同的名稱一段時間,所以我需要找出一些任務名稱,可能包括時間戳。
我選擇任務隊列而不是某些數據庫唯一方法的原因是隨附的故障轉移機制。由於我的工人很可能會失敗,所以另一名工人將完成任務。另外它減少了數據庫調用和api調用。
我想我會去重構在它自己的模型中的「任務狀態」來建立一種命令模型。這也將作爲任務的日誌,因此可以看到執行級別發生了什麼。也許這與任務隊列一起工作,如果沒有,我會看看我是否可以刪除隊列。
感謝您的意見,我更新了我的問題和建議 – pfried