2016-11-09 3 views
2

Wir versuchen, eine einfache Veröffentlichung zu einem vorhandenen Thema nach einem Ereignis auf einem unserer verteilten Systeme zu tun.Google PubSub Rückgabe google.gax.errors.GaxError: GaxError RPC fehlgeschlagen verursacht durch ... StatusCode.UNAVAILABLE

Der Code sieht so aus:

try: 
    dat = data.encode('utf-8') 
    topic.publish(dat) 
except: 
    <code to recover> 

Wenn wir alle mit dem Fang mit Ausnahme und die Spur zurück zu drucken, erhalten wir:

google.gax.errors.GaxError: GaxError(RPC failed, caused by <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, {"created":"@1478711654.067744009","description":"Secure read failed","file":"src/core/lib/security/transport/secure_endpoint.c","file_line":157,"grpc_status":14,"referenced_errors":[{"created":"@1478711654.067706801","description":"EOF","file":"src/core/lib/iomgr/tcp_posix.c","file_line":235}]})>

(volle Fehler unten)

Mit Blick auf http://gcloud-python.readthedocs.io/en/latest/pubsub-topic.html#google.cloud.pubsub.topic.Topic.publish, es scheint nicht, dass dieser GAX-Fehler etwas ist, das wir suchen sollten, um zu fangen. Wenn wir jedoch tun fangen den Fehler und exponentiellen Backoff verwenden, um es erneut zu versuchen, funktioniert dies normalerweise das zweite Mal.

Ich fand this discussion und während es auf einen möglichen Fehler in _gax_python spricht, scheint es nicht relevant zu sein. Irgendwelche Gedanken darüber, was wir hier falsch machen könnten?

Voll Fehler:

458 Traceback (most recent call last): 
    459  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner 
    460  self.run() 
    461  File "/usr/lib/python3.5/threading.py", line 862, in run 
    462  self._target(*self._args, **self._kwargs) 
    463  File "/home/pp/pp/pp/process/uploader.py", line 145, in upload_thread 
    464  topic.publish(byte_string) 
    465  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/cloud/pubsub/topic.py", line 257, in publish 
    466  message_ids = api.topic_publish(self.full_name, [message_data]) 
    467  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/cloud/pubsub/_gax.py", line 165, in topic_publish 
    468  options=options) 
    469  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/cloud/gapic/pubsub/v1/publisher_api.py", line 289, in publish 
    470  return self._publish(request, options) 
    471  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/gax/api_callable.py", line 481, in inner 
    472  return api_caller(api_call, this_settings, request) 
    473  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/gax/api_callable.py", line 158, in inner 
    474  return a_func(request, **kwargs) 
    475  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/gax/api_callable.py", line 434, in inner 
    476  errors.create_error('RPC failed', cause=exception)) 
    477  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/future/utils/__init__.py", line 419, in raise_with_traceback 
    478  raise exc.with_traceback(traceback) 
    479  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/gax/api_callable.py", line 430, in inner 
    480  return a_func(*args, **kwargs) 
    481  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/google/gax/api_callable.py", line 64, in inner 
    482  return a_func(*updated_args, **kwargs) 
    483  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/grpc/_channel.py", line 481, in __call__ 
    484  return _end_unary_response_blocking(state, False, deadline) 
    485  File "/home/pp/.virtualenvs/cv/lib/python3.5/site-packages/grpc/_channel.py", line 432, in _end_unary_response_blocking 
    486  raise _Rendezvous(state, None, None, deadline) 
    487 google.gax.errors.GaxError: GaxError(RPC failed, caused by <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, {"created":"@1478711654.067744009","description":"Secure read failed","file":"src/core/lib/security/transport/secure_endpoint.c","file_line":157,"grpc_status":14,"referenced_errors":[{"created":"@1478711654.067706801","description":"EOF","file":"src/core/lib/iomgr/tcp_posix.c","file_line":235}]})> 

Antwort

3

Es sieht aus wie die entsprechende Diskussion Sie suchen ist die Ausgabe 2683, "Frequent gRPC StatusCode.UNAVAILABLE errors".

Sie tun nichts falsch, und es scheint, als ob Sie die Ausnahme abfangen und das Wiederholen ist die derzeit beste Lösung.

0

Wenn das Thema eine globale Variable ist, wird der Fehler nicht mehr angezeigt. Machen Sie das Thema eine Klassenvariable und es nur einmal instanziiert - nur diese Zeile rufen einmal:

topic = pubsub.Client().topic(name) 

Auch, wie dies für Python funktioniert 2.7 nur scheint - in Python 3.6 erneuten Versuch der Schmerz ein wenig betäubt.

Deaktivieren gRPC funktioniert der Trick für Python 3.6 - dies kann durch das Setzen der Umgebungsvariablen durchgeführt werden:

ENV GOOGLE_CLOUD_DISABLE_GRPC=true 
0

Ich schaffe eine „nicht so schön“ Abhilfe zu bekommen. Verwenden einer Richtlinie, die Code für deadline_exceeded auf google.cloud.pubsub_v1.subscriber.policy.thread.Policy.on_exception repliziert.

from google.cloud.pubsub_v1.subscriber.policy.thread import Policy 
import grpc 

class UnavailableHackPolicy(Policy): 
    def on_exception(self, exception): 
     """ 
     There is issue on grpc channel that launch an UNAVAILABLE exception now and then. Until 
     that issue is fixed we need to protect our consumer thread from broke. 
     https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2683 
     """ 
     unavailable = grpc.StatusCode.UNAVAILABLE 
     if getattr(exception, 'code', lambda: None)() in [unavailable]: 
      print("¡OrbitalHack! - {}".format(exception)) 
      return 
     return super(UnavailableHackPolicy, self).on_exception(exception) 

On-Meldung Funktion erhalte ich einen Code haben wie

subscriber = pubsub.SubscriberClient(policy_class=UnavailableHackPolicy) 
subscription_path = subscriber.subscription_path(project, subscription_name) 
subscriber.subscribe(subscription_path, callback=callback, flow_control=flow_control) 

Problem ist, dass, wenn die Ressource es wirklich belegt sind, werden wir nicht bewusst sein. Obwohl das GRPC-Entwicklerteam dieses Problem beheben kann, werden wir diese Problemumgehung verwenden.

Verwandte Themen