私は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のタスクはありますか?」と聞くことはできません。現在キューにあるアイテムの数はいくつですか?
私はこれをプッシュキューとして使用することを理解しています.1つの考え方はプルキューに切り替え、キューからアイテムをリースすることです。タグを付けてグループ化します。それは良いでしょうか?
私が本当に望むのは、3秒ごとに何かをスケジューリングするためのcronのようなスケジューラだけですが、GAEのスケジューラがその解決に向かない可能性があります。
私はちょうど例えば、起動ハンドラにすべてを移動することができます:私はこれを行うと、その単一の要求であることを認識されているよう
@app.route('/_ah/start')
def start():
log.info('Ticker instance started')
while True:
_do_tick()
sleep(3)
return 200
しかし、私が見たものからは、ログは、更新されません決して完了しません。これにより、何が起きているのかをログで確認するのが少し難しくなります。現在、個々のティックは別々のリクエストログエントリとして表示されます。
また、上記が殺された場合は、とにかく自分自身のスケジュールを変更する必要があります。インスタンスがシャットダウンしようとしているときに例外をキャッチできる例外があることがわかっているので、あまり面倒ではないかもしれませんし、遅延タスクを再開して再開することもできます。
GAEでこれを処理する方がいいですか?
3秒ごとに何かするのは非常に難しいようです。必要に応じて、必要に応じてすべての計算を行うことができますか?たとえば、ユーザーからのリクエストを受け取ったら、現在の時間に基づいて必要な計算をすべて実行し、その結果をユーザーに提示しますか? –
悲しいかな、これは連続走行シミュレーションです。これは、データベース内の多数のデータを更新していて、同時に数〜400のゲームクライアントが同時にアクセスしています。 –