2015 年 3 月から Google AppEngine Managed VM/Java を使用しています。すべて問題なく動作しています。しかし、2015 年 9 月、10 月以降、マネージド VM インスタンス ログに「com.google.apphosting.vmruntime.VmApiProxyDelegate」のエラー ログが頻繁に表示されるようになりました。
気がついたエラーログ2組。
1 つ目は、マネージド VM インスタンスでのデータストア操作に関するものです。それは起こる
- datastore_v3.Get()。
- datastore_v3.RunQuery()
- datastore_v3.Put()
- memcache.Get()。
ログで見たスタックトレースのサンプルは以下です... (以下のサンプルは datastore_v3.Put() のものです)
com.google.apphosting.vmruntime.VmApiProxyDelegate runSyncCall: datastore_v3.Put の HTTP ApiProxy I/O エラー: 読み取りタイムアウト
com.google.apphosting.api.ApiProxy$RPCFailedException: アプリケーション サーバーへのリモート RPC が datastore_v3.Get() の呼び出しに失敗しました。com.google.apphosting.vmruntime.VmApiProxyDelegate.runSyncCall(VmApiProxyDelegate.java:182) com.google.apphosting.vmruntime.VmApiProxyDelegate.makeApiCall(VmApiProxyDelegate.java:141) com.google.apphosting.vmruntime.VmApiProxyDelegate.access com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:375) で $000(VmApiProxyDelegate.java:47) com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:351) でjava.util.concurrent.FutureTask.run(FutureTask.java:262) で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) で java.util.concurrent で。
したがって、このエラーが発生したとき、アプリケーション レベル (私のコード) で RPCFailedException が発生しましたが、現在、再試行メカニズムで処理していません (App Engine Datastore API で ConcurrentModificationException の再試行メカニズムのみを使用しています)。
エラー ログの 2 番目のグループは、マネージド VM の TaskQueue API に関するものです。
私が得たエラーメッセージは...
com.google.apphosting.vmruntime.VmApiProxyDelegate runSyncCall: エラー本文: RPC エラー: /StubbyService.Send to (不明): APP_ERROR(2)
トレースすると、詳細なスタックトレースが...
com.wat_suttiwat.batchengine.job.PushNotificationTaskExecutor executeTask: アプリケーション サーバーへのリモート RPC が taskqueue.QueryAndOwnTasks() の呼び出しに失敗しました。com.google.apphosting.api.ApiProxy$RPCFailedException: アプリケーション サーバーへのリモート RPC が taskqueue.QueryAndOwnTasks() の呼び出しに失敗しました。com.google.apphosting.vmruntime.VmApiProxyDelegate.runSyncCall(VmApiProxyDelegate.java:161) com.google.apphosting.vmruntime.VmApiProxyDelegate.makeApiCall(VmApiProxyDelegate.java:141) com.google.apphosting.vmruntime.VmApiProxyDelegate.access com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:375) で $000(VmApiProxyDelegate.java:47) com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:351) でjava.util.
アプリケーション レベルで発生した「RPCFailedException」例外 (最初のケースと同様)。そして、Google AppEngine フロントエンド インスタンス (マネージド VM インスタンスではない) に気付きました。通常どおり動作し、これらについてエラーはありません。
だから私の質問は
RPCFailedException の再試行メカニズムを追加する必要がありますか? 再試行を追加すると便利ですか? これに関する Google AppEngine ドキュメントのドキュメントはありません。
誰かが私と同じ問題を抱えていますか? はいの場合は、このイシュー トラッカー (#12393) で問題の投票にご協力ください: https://code.google.com/p/googleappengine/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type %20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log&groupby=&sort=&id=12393
回避策があれば、共有してください。
本当にありがとう