1

データストアに対して 1000 の異なるクエリを作成し、個々のクエリの結果に対していくつかの計算を行い (1000 の個別の結果を取得する)、結果のリストを返したい状況があります。

クライアント側のパフォーマンスを向上させるために、計算を開始したのと同じ 30 秒のユーザー要求からの応答として結果のリストが返されるようにしたいと考えています。ハッ!

私には大胆な計画があります。

これらの各操作は、通常、1 秒以内に完了する問題はなく、他の操作と同じエンティティ グループに書き込む必要はなく、他のクエリからの情報を必要としません。1000 の独立したタスクを開始し、それぞれがこれらのクエリの 1 つを受け取り、計算を行い、結果をエンティティの一時的なコレクションのようなものに保存することは可能でしょうか? 元のリクエストは 10 秒待ってから、データストアからの結果に対して 1 つのクエリを実行できます (クエリできる一意の値がすべて設定されている可能性があります)。まだ入っていない結果はクライアント側で通知され、クライアントはさらに 10 秒後にそれらの値を再度要求することができます。

経験豊富なアプリ エンジニアに答えてもらいたい質問は次のとおりです。

  • これはばかげていますか?もしそうなら、それはいくつものタスクにとってばかげていますか? 一度に50個は合理的でしょうか?
  • 同じエンティティを 1 秒間に 20 回読み取っても、データストアの競合は発生しませんよね? その論争はすべて書くためのものですか?
  • タスクから応答を取得する簡単な方法はありますか?
4

2 に答える 2

1

ええ、かなりばかげているように聞こえます:)

そのような操作を Taskqueue に頼るべきではありません。1000 個のタスクがすぐに生成されることに期待することはできません (ただし、生成される可能性が最も高いですが)。

Channel API を使用して応答を待ちませんか。したがって、ソリューションは次のようになります。

  • クライアントがサーバーにリクエストを送信
  • サーバーは N 個のタスクを生成して計算を行い、Channel API トークンでクライアントに応答します
  • クライアントはトークンを使用してチャネルをリッスンします
  • すべてのタスクが完了すると、サーバーはチャネルを介してクライアントに応答をプッシュします

これにより、タスクが思ったほど速く実行されない、またはその他の理由により、時々発生する可能性が非常に高いタイムアウトの問題を回避できます。

于 2011-04-05T17:00:14.937 に答える
1

タスク キューは、タスクがいつ実行されるかについて確固たる保証を提供しません。ETA (デフォルトでは現在の時刻) はタスクが実行される最も早い時刻ですが、キューがバックアップされている場合、または使用可能なインスタンスがない場合タスクを実行するために、かなり後で実行される可能性があります。

1 つのオプションは、クエリを並行して実行できるDatastore Plus / NDBを使用することです。ただし、どのように実行しても、1000 クエリは非常にコストがかかります。

@Chris が提案する別のオプションは、チャネル API でタスク キューを使用することです。これにより、クエリが完了したときにユーザーに非同期で通知できます。

于 2011-04-06T01:31:24.747 に答える