5

今日、Google App Engine アプリのサービス コールが機能しなくなり、次のエラーが返されました。

500 サーバー エラー

エラー: サーバー エラー

サーバーでエラーが発生したため、リクエストを完了できませんでした。

問題が解決しない場合は、問題を報告し、このエラー メッセージとその原因となったクエリをお知らせください。

HTML コード:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>500 Server Error</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Server Error</h1>
<h2>The server encountered an error and could not complete your request.<p>If the problem persists, please <A HREF="http://code.google.com/appengine/community.html">report</A> your problem and mention this error message and the query that caused it.</h2>
<h2></h2>
</body></html>

GAE システムのステータスを確認したところ、Memcache のステータスが「調査中」であることがわかりました。その日の後半、すべてのシステム ステータスは正常ですがOverQuotaException、サービス コールから次のように連絡がありました。

Uncaught exception from servlet
com.google.apphosting.api.ApiProxy$OverQuotaException: The API call datastore_v3.Put() required more quota than is available.
    at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:491)
    at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:392)
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:781)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.rpcFinished(RpcStub.java:823)
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.success(RpcStub.java:808)
    at com.google.net.rpc3.impl.client.RpcClientInternalContext.runCallbacks(RpcClientInternalContext.java:902)
    at com.google.net.rpc3.impl.client.RpcClientInternalContext.finishRpcAndNotifyApp(RpcClientInternalContext.java:807)
    at com.google.net.rpc3.impl.client.RpcNetChannel.afterFinishingActiveRpc(RpcNetChannel.java:1110)
    at com.google.net.rpc3.impl.client.RpcNetChannel.finishRpc(RpcNetChannel.java:950)
    at com.google.net.rpc3.impl.client.RpcNetChannel.handleResponse(RpcNetChannel.java:2335)
    at com.google.net.rpc3.impl.client.RpcNetChannel.messageReceived(RpcNetChannel.java:2137)
    at com.google.net.rpc3.impl.client.RpcNetChannel.access$2100(RpcNetChannel.java:150)
    at com.google.net.rpc3.impl.client.RpcNetChannel$TransportCallback.receivedMessage(RpcNetChannel.java:3214)
    at com.google.net.rpc3.impl.client.RpcChannelTransportData$TransportCallback.receivedMessage(RpcChannelTransportData.java:614)
    at com.google.net.rpc3.impl.wire.RpcBaseTransport.receivedMessage(RpcBaseTransport.java:405)
    at com.google.apphosting.runtime.udrpc.UdrpcTransport$ClientAdapter.receivedMessage(UdrpcTransport.java:425)
    at com.google.apphosting.runtime.udrpc.UdrpcTransport.dispatchPacket(UdrpcTransport.java:266)
    at com.google.apphosting.runtime.udrpc.UdrpcTransport.readPackets(UdrpcTransport.java:218)
    at com.google.apphosting.runtime.udrpc.UdrpcTransport$1.run(UdrpcTransport.java:82)
    at com.google.net.eventmanager.AbstractFutureTask$Sync.innerRun(AbstractFutureTask.java:260)
    at com.google.net.eventmanager.AbstractFutureTask.run(AbstractFutureTask.java:121)
    at com.google.net.eventmanager.EventManagerImpl.runTask(EventManagerImpl.java:578)
    at com.google.net.eventmanager.EventManagerImpl.internalRunWorkerLoop(EventManagerImpl.java:1002)
    at com.google.net.eventmanager.EventManagerImpl.runWorkerLoop(EventManagerImpl.java:884)
    at com.google.net.eventmanager.WorkerThreadInfo.runWorkerLoop(WorkerThreadInfo.java:136)
    at com.google.net.eventmanager.EventManagerImpl$WorkerThread.run(EventManagerImpl.java:1855)

GAE ダッシュボードの [クォータの詳細] の下で、すべてのリソースがクォータを下回っており、レートの列に "OK" が表示されています。アプリでも課金を有効にしていますが、割り当てを超えていたとしても、このエラーは発生しません。ここで何が問題なのですか?Put()このサービス呼び出しでメソッドを呼び出しているわけではありません。私はデータを照会しているだけです。

更新:クォータの次のリセットが残り 0 時間 (おそらく 20 分後の太平洋時間の午前 0 時) に近づいているため、実際にクォータを超えていないため、次の新しいエラーが発生します。

503 オーバー クォータ

エラー  

クォータ超過

このアプリケーションは一時的にサービス割り当てを超えています。後でもう一度やり直してください。

HTML コード:

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>503 Over Quota</title>
<style><!--
body {font-family: arial,sans-serif}
div.nav {margin-top: 1ex}
div.nav A {font-size: 10pt; font-family: arial,sans-serif}
span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold}
div.nav A,span.big {font-size: 12pt; color: #0000cc}
div.nav A {font-size: 10pt; color: black}
A.l:link {color: #6f6f6f}
A.u:link {color: green}
//--></style>

</head>
<body text=#000000 bgcolor=#ffffff>
<table border=0 cellpadding=2 cellspacing=0 width=100%>
<tr><td bgcolor=#3366cc><font face=arial,sans-serif color=#ffffff><b>Error</b></td></tr>
<tr><td>&nbsp;</td></tr></table>
<blockquote>
<H1>Over Quota</H1>
This application is temporarily over its serving quota.  Please try again later.

<p>
</blockquote>
<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=#3366cc><img alt="" width=1 height=4></td></tr></table>
</body></html>

このエラーは、アプリで何かを行うと表示され、HTML コードがダイアログ ボックスに表示されます。

更新 2:クォータがリセットされ、アプリが正常に機能するようになりました。しかし、これはそもそもなぜこれが起こったのかという私の質問には答えません。幸いなことに、私はまだアプリを開発中であり、このサーバーの不具合に悩まされたのは私だけでした. このような状況で、サーバーをオンラインに戻すにはどうすればよいですか? これはよくあることですか?サーバーがエラーをスローし、アプリが機能していない場合、電子メール通知を受け取る方法はありますか? サーバーがリセットされるまで 24 時間待つことは、明らかに有効な解決策ではありません。

4

1 に答える 1

0

アプリケーションが、最初の memcache クエリが失敗した場合にデータストアに何度もヒットするように設計されている可能性があると思います。または、memcache に値を設定できなかった場合、そこにあると仮定して再試行することはありません。わからないログにそれが表示されないのはなぜですか (概要ではなく、拡張されたクォータ ログを見ているのでしょうか?)

障害点を設計することをお勧めします。たとえば、データストアが利用できない場合でも、アプリはクラッシュせず、適切なメッセージがユーザーに返されます。同様に、バックエンドも 24 時間年中無休で実行されるはずですが、インスタンスを閉じる必要がある場合に備えて、シャットダウン コードを組み込む必要があります (事前に通知されます!)。

ただし、あなたの質問(なぜこれが起こったのか)が現在の形で答えられるとは思えません。

于 2013-03-06T09:45:28.860 に答える