3

J'utilise un moteur d'application et une grosse requête comme backend pour mon site web. Chaque fois que l'utilisateur clique, je le connecte à bigquery pour effectuer des analyses plus tard dans la journée. Je me rapproche de 75 000 clics par jour. Cela fonctionnait bien jusqu'à la semaine dernière. C'est le code que j'utilise.app_identity_service.GetAccessToken() requis plus de quota que ce qui est disponible

body = {"rows":[bodyFields]} 

    credentials = appengine.AppAssertionCredentials(scope=BIGQUERY_SCOPE) 
    http = credentials.authorize(httplib2.Http()) 
    bigquery = discovery.build('bigquery', 'v2', http=http) 

    response = bigquery.tabledata().insertAll(
     projectId=PROJECT_ID, 
     datasetId=BIGQUERY_DATASETID, 
     tableId=BIGQUERY_TABLEID, 
     body=body).execute() 

Maintenant, tout d'un coup je dépasse l'exception de quota. Mon application est une instance de moteur d'application payante. Ci-dessous la pile trace de mon exception

dashboard screenshot

Attempting refresh to obtain initial access_token 

The API call app_identity_service.GetAccessToken() required more quota than is available. 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/filename.py", line 1611, in post 
    bigquery = discovery.build('bigquery', 'v2', http=http) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/oauth2client/util.py", line 129, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/apiclient/discovery.py", line 198, in build 
    resp, content = http.request(requested_url) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/oauth2client/util.py", line 129, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/oauth2client/client.py", line 516, in new_request 
    self._refresh(request_orig) 
    File "/base/data/home/apps/s~projectname/bigqueryapi.387952303347375306/oauth2client/appengine.py", line 194, in _refresh 
    scopes, service_account_id=self.service_account_id) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/app_identity/app_identity.py", line 589, in get_access_token 
    scopes, service_account_id=service_account_id) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/app_identity/app_identity.py", line 547, in get_access_token_uncached 
    return rpc.get_result() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result 
    return self.__get_result_hook(self) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/app_identity/app_identity.py", line 519, in get_access_token_result 
    rpc.check_success() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success 
    self.__rpc.CheckSuccess() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 134, in CheckSuccess 
    raise self.exception 
OverQuotaError: The API call app_identity_service.GetAccessToken() required more quota than is available. 

Mon trafic n'a pas augmenté par beaucoup aussi le nombre de fois que le gestionnaire est touché est presque le même que les données 2 derniers mois. Alors pourquoi je reçois cette erreur.

Répondre

2

Afin de déterminer pourquoi vous rencontrez l'erreur de quota, vous devrez partager plus de détails sur votre utilisation. Le quota doit être réinitialisé toutes les 24 heures. Savez-vous combien de temps il faut pour que l'erreur apparaisse et combien de trafic vous avez servi avec succès à ce moment-là?

Vous avez mentionné que vous "effectuez des analyses plus tard dans la journée", ce qui suggère que vous utilisez peut-être le TaskQueue API ou Deferred Tasks. Il est possible que ces tâches échouent pour d'autres raisons et retrying, ce qui pourrait rapidement faire grimper votre quota. Si vous utilisez TaskQueues, vous pouvez essayer de régler le queue configuration and retry options. Une autre façon de conserver votre quota consisterait à enregistrer le service de découverte bigquery que vous construisez dans l'API Memcache, afin qu'il puisse être réutilisé pour plusieurs demandes au service BigQuery.

+0

J'utilise tonne de TaskQueue pour appeler des fonctions dont je ne veux pas bloquer l'heure pour l'utilisateur. Est-ce que la file d'attente de tâches mange le quota d'access_token? – Sriram

+0

J'ai également senti que le problème était avec le service de découverte. J'ai donc réécrit mon code pour utiliser le point de terminaison api REST de bigQuery. encore le problème persiste. Aussi selon ma compréhension, l'API du moteur d'application gère la mise en cache de access_token par défaut – Sriram

+0

L'utilisation de TaskQueue n'affectera pas votre quota 'access_token' et il n'y a rien de mal à utiliser la TaskQueue. Le 'access_token' pourrait être mis en cache, mais il est probable qu'il soit mis en cache par requête et chaque tâche s'exécute dans une requête séparée. Avez-vous des statistiques que vous pouvez partager sur le nombre de tâches que vous exécutez par jour et combien fonctionnent avec succès? – erichiggins