2017-08-21 3 views
0

—タスク、特に単一のエンティティで動作するタスク—がプッシュキューにそのような時間以前に追加されたタスクが完了したことを示します。それから同じエンティティ—に対して同じタスク—を追加することができます。GAEでプッシュキューにタスクが1回だけ追加されることを保証する

  1. プッシュキューにエンティティAを更新するために、タスクXを追加します。

    簡単な例は、私のことができるようにしたいエンティティAを更新したタスクです。

  2. タスクXがエンティティAのキューにある間、エンティティAのタスクXを追加しようとする他のすべての試行は失敗します。
  3. 一度完成し、私は再び実体A.簡単な解決策は、タスクXの名とユニークIDの両方を組み込んだタスク名を使用するように思わ

のタスクXを追加することができるはずです

しかし、私はこのアプローチが条件3を満たしていないと思います。タスク名は制御不能な期間に「トゥーンストーン」になります。&はそれまでは再利用できません。 docsから

独自のタスク名を割り当てることの利点は、 タスクは一度しか追加されていること*という名前のタスクが 重複除外、あなたが保証するために、タスク名を使用することができることを意味しているということです。 タスクの完了後または削除後、重複除外は9日間続きます。

タスク名を9日間再使用することはできませんか?

+0

なぜ#2が必要ですか? – marcadian

+0

私はそのエンティティを更新する上で不必要な競合がないようにします。 – markvgti

+0

更新タスクをエンキューできないエンティティの変更はどうしますか? –

答えて

1

実際、タスク名はキューに入れられなくなってから9日間は再利用できません。おそらく以前の同じ名前のタスクのすべてのトレースを確実にするための安全上の理由は、分散したインフラ全体から消去されます。

タスク名に現在のタイムスタンプをエンコードすると、実際の書き込みレートが1/s(同じエンティティグループへの最大平均書き込みレート)に制限されます。すでにキューに入っているためにタスクをエンキューできない場合は、次の秒間エンキューしようとします(別の更新タスクをトリガーする別の方法がない場合)。 しかし、あなたが参照したのと同じ文書で言及されたパフォーマンスの影響を避けるために、タスク名の最後にタイムスタンプをエンコードしてください。

+0

興味深い考え方のタイムスタンプ。他のやや似ているユースケースでは、私は既にタイムスタンプを使用していますが、ミリ秒に訂正しています... – markvgti

1

私は単一のエンティティに対して多数の小さな更新を行う必要がある過去のこのユースケースを持っていますが、更新を直ちに反映する必要はありません。私はプルキューで更新プログラムをバッチすることで解決しました。私はcronジョブを実行して、多くのタスクをプルしてバッチ更新を実行するようにしました。私の場合、cronジョブは単純にプッシュキューにタスクをエンキューします。タスクはプルキューから消費され、トランザクション更新を行います。

参考資料https://cloud.google.com/datastore/docs/articles/fast-and-reliable-ranking-in-datastore/

+0

これは私の使用例に似ています:多くの更新を行う必要がありますが、即時性は問題ではありません。プルキューを避けることを望んでいましたが、おそらくそれが行く方法です... – markvgti

+0

なぜプルキューを避けたいですか? :P設定するのに少し余分なコードですが、競合と超高速です! – marcadian

+0

基本的には、プルキューを使ってさらに便利なクラスを設定する必要があります.--)。再試行されたトランザクションが本当に好きな競合部分は、多くの時間を浪費します。 – markvgti

関連する問題