2016-01-20 14 views
7

大きいデータストアPutMultiコール(エンティティ500)をバッチのエンティティに分割し、より小さいPutMultiコール(それぞれ100個のエンティティ)を送信するコンカレントゴルーチンを実行することで、Google App Engineリクエストハンドラを高速化しようとしています。appengineデータストアタイムアウトエラー5と11の違いは何ですか?

これまでは、多くの同時リクエストでハンドラをテストしたときに、PutMultiの呼び出しからデータストアエラーCall error 11: Deadline exceeded (timeout)が期限切れになることがよくありました。並列化の後、ハンドラは高速化しましたが、私はまだ時々そのエラーと別のタイプのエラー、API error 5 (datastore_v3: TIMEOUT): The datastore operation timed out, or the data was temporarily unavailableを取得しました。

このエラーは、データストア内の競合が原因であり、エラー5と11の違いは何ですか?

+2

最初に表示されるエラーは、通常の操作ではタイムアウトに過ぎないかもしれません.2番目は書き込み競合のためです。詳細:[Datastoreエラーの処理](https://cloud.google.com/appengine/articles/handling_datastore_errors) – icza

+0

ありがとうございました!素晴らしいことを続けてください! –

答えて

1

これらのエラーは2つの異なる場所から発生します。最初の呼び出しエラーは、RPCクライアントのタイムアウトによって発生するローカルエラーです。これは、RPCの完了を待っているタイムアウトがあったことを示します。 google.golang.org/appengineのデフォルトのRPCタイムアウトは60秒です。

2番目のエラーはサービス側からのものです。このエラーは、データストア内で操作を実行中にタイムアウトが発生したことを示します。これらの操作の中には、60秒よりもはるかに短いタイムアウトがあり、通常これは競合を示す可能性があります。

これらの相違点を理解するための簡単な方法は、非常に多数の変更を加えた単一のマルチ操作を行うと、最初のタイムアウトを容易に開始できることです。単一のキーまたは小さなセットのキーに対して多数の並行操作を作成すると、後者をより簡単にトリガーします。タイムアウトは、共有リソースの飽和の一般的な指標であるため、もちろんそれらを生成するための多くの方法と組み合わせがあります。一般に、適切な操作を再試行し、適切なサイズ操作を行い、競合関連の問題の可能性を最小限に抑えるためにできるだけホットキーの操作を集約したいと考えています。他の人が示唆しているように、PythonとJavaのドキュメントには既にこれのいくつかの例があります。

https://godoc.org/google.golang.org/appengine#IsTimeoutErrorを使用し、最初のエラークラスのタイムアウトを増やす必要がある場合は、コンテキストの期限を調整することができます。方法はこちらを参照してください。https://godoc.org/golang.org/x/net/context#WithDeadline注:あなたはできません締め切りを要求締め切り期限を超えて延ばすことができますが、タスクやVMで実行している場合、長い期限まで延長することができます。

関連する問題