3

私のアプリは、リクエストごとに多くのデータストア操作を行う必要があります。より良い応答時間を得るために、それらを並行して実行したいと思います。

データストアの更新については、バッチ プットを行っているため、それらはすべて非同期で行われるため、ミリ秒単位で節約できます。App Engine では、最大 500 のエンティティを並行して更新できます。

しかし、さまざまな種類のデータストア フェッチを並行して実行できるようにする組み込み関数は見つかりませんでした。

App Engine では urlfetch 呼び出しを非同期で実行できるため、クエリ結果を JSON 形式のテキストとして返すゲッター URL を種類ごとに作成しました。これで、アプリはこれらの URL に対して非同期の urlfetch 呼び出しを実行できるようになり、データストアのフェッチを並列化できるようになりました。

この手法は、少数の並列リクエストではうまく機能しますが、これらの urlfetch 呼び出しを同時に 5 つまたは 10 を超えて実行しようとすると、App Engine はエラーをスローします。

私は今テストしているだけなので、各 urlfetch は同一のクエリです。それらは少量では問題なく動作しますが、同時リクエストが多数になると失敗し始めるため、非同期の urlfetch 呼び出しと関係があるに違いないと考えています。

私の質問は次のとおりです。

  1. 非同期で実行できる urlfetch.create_rpc() 呼び出しの数に制限はありますか?
  2. 同期 urlfecth.fetch() 関数には、失敗する前に関数が応答を最大 10 秒待機できるようにする「deadline」パラメーターがあります。urlfetch.create_rpc() に応答を待つ時間を伝える方法はありますか?
  3. 以下に示すエラーは何を意味しますか?
  4. さまざまな種類のデータストア フェッチを並行して実行するための、より優れたサーバー側の手法はありますか?

    ファイル "/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py" の 501 行目、get_result で self.__get_result_hook(self) を返す ファイル "/base/python_lib/versions/1/google/appengine/api" /urlfetch.py​​"、331 行目、_get_fetch_result raise DownloadError(str(err)) InterruptedError: ('Wait() 要求は、別のコールバックからの例外によって中断されました:'、DownloadError('ApplicationError: 5 ',))

4

3 に答える 3

2

App Engine では非同期の urlfetch 呼び出しは許可されていますが、非同期のデータストアの取得は許可されていないため、urlfetch RPC を使用してデータストアから並行して取得しようとしていました。

非同期データストア取得の欠如は、認識されている問題です:

http://code.google.com/p/googleappengine/issues/detail?id=1889

そして、非同期クエリを可能にするサードパーティ ツールが追加されました。

http://code.google.com/p/asynctools/

「asynctools は、Google App Engine API 呼び出しを並行して実行できるライブラリです。API 呼び出しを混ぜてキューに入れると、すべてが並行して開始されます。」

これはまさに私が探していたものです。

于 2010-02-05T02:35:26.213 に答える
0

TaskQueuesを使用して、後で実行されるリクエストをキューに入れる作業を行うことを検討しましたか?

タスクが4xxステータスを返す場合、失敗したと見なされ、後で再試行されます。そのため、エラーをバックアップして、成功するまでタスクキューに要求の再試行を処理させることができます。また、バケットのサイズとレートをいくつか試してみると、データベースを最大限に活用できないほど、タスクキューでリクエストの速度を落とすことができます。

物事をさらに簡単にする素晴らしいラッパー(deferred.defer)もあります-アプリ内の(ほぼ)すべての関数への遅延呼び出しを行うことができます。

于 2009-12-30T06:59:59.347 に答える
0

残念ながら、あなたが提起した質問に直接答えることはできませんが、これらの線に沿ったあなたの研究のすべてがあなたの問題の有効な解決策につながらない可能性があることを伝えるべきだと思います.

問題は、データストアの書き込みが読み取りよりもはるかに長い時間がかかることです。そのため、発生する可能性のある読み取りの数を最大にする方法を見つけた場合、すべてのデータストアに対応する書き込みを行うことができるようになる前に、コードは非常に時間がなくなります。あなたが読んだエンティティの。

必要な読み取りと書き込みの回数を減らすために、データストア クラスの設計を再考することを真剣に検討します。これはすぐにアプリケーションのボトルネックになるからです。

于 2009-12-27T15:06:59.750 に答える