我有一個我在GAE上開發的服務。應用程序需要每3秒「勾選一次以執行一堆計算。這是一款模擬型遊戲。在Google App Engine的任務隊列中避免重複的任務(或處理它們)
我有一個使用像這樣的deferred
API和任務隊列(一些錯誤處理等,爲了清楚而移除)手動縮放實例,我開始:
@app.route('/_ah/start')
def start():
log.info('Ticker instance started')
return tick()
@app.route('/tick')
def tick():
_do_tick()
deferred.defer(tick, _countdown=3)
return 'Tick!', 200
的問題是,有時我結束了由於某種原因(這可能是暫時的錯誤/超時導致任務被重新安排),並且我在任務隊列中結束了多個任務,並且該遊戲每3秒週期多次打勾。
任何想法如何最好地處理這個?
據我所見,你不能問一個隊列'有X的任務已經存在嗎?'或「此刻隊列中有多少物品?」。
筆者瞭解到,這款採用的推隊列,一個想法可能要改用拉入隊列,並有從隊列中,通過標籤分組,這將讓所有的人,包括重複自動收報機租賃項目。這會更好嗎?
實際上,我真正想要的只是一個類似cron的調度程序,每3秒調度一次,但我知道GAE上的調度程序可能不會運行到該分辨率。
我可不可以乾脆一切都變成了啓動處理程序,如:
@app.route('/_ah/start')
def start():
log.info('Ticker instance started')
while True:
_do_tick()
sleep(3)
return 200
但是從我所看到的,日誌將不會更新爲我做到這一點,因爲它被認爲是一個單一的請求從未完成。這使得在日誌中看到發生了什麼變得更難。目前我將每個單獨的滴答作爲一個單獨的請求日誌條目。
此外,如果上述死亡,我需要得到它重新安排自己無論如何。這可能不會太麻煩,因爲我知道當實例即將關閉時可以捕獲異常,然後我可以啓動延遲任務以重新啓動該實例。
或者還有更好的方法來處理GAE?
每3秒鐘做一件事似乎非常具有挑戰性。您是否可以在需要時根據需求進行所有計算?例如,當您收到用戶的請求時,根據當前時間進行所有需要的計算並將結果呈現給用戶? –
唉不,它是一個連續運行的模擬。這正在更新數據庫中的一堆數據,然後同時被400多個遊戲客戶訪問。 –