2016-11-09 26 views
2

私たちは、分散システムのいずれかでイベントが発生した後、既存のトピックに簡単に公開しようとしています。見るとgoogle.gax.errors.GaxErrorを返すGoogle PubSub:GaxError RPCが原因で失敗しました... StatusCode.UNAVAILABLE

(以下フルエラー)

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}]})>

を:私たちは除いて、すべてをキャッチし、バックトレースを印刷する場合、我々が得る

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

コードは次のようになりますhttp://gcloud-python.readthedocs.io/en/latest/pubsub-topic.html#google.cloud.pubsub.topic.Topic.publish、これはGAXエラーのようには見えません。しかし、を実行してエラーをキャッチし、指数バックオフを使用して再試行すると、通常は2回目の動作となります。

私はthis discussionを見つけましたが、_gax_pythonの潜在的なエラーとは言いませんが、それは関係していないようです。私たちがここで間違っているかもしれないことについての考え?

全エラー:

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}]})> 

答えて

3

それはあなたが探している関連の議論のように見えますが、問題2683年、 "Frequent gRPC StatusCode.UNAVAILABLE errors" です。

あなたは間違ったことはしていないし、例外をキャッチしているようで、再試行は現時点で最も適切な回避策です。

0

トピックがグローバル変数の場合、エラーの生成は停止します。トピックにクラス変数を作成し、一度だけ、それをインスタンス化 - 一度だけこの行を呼び出す:

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

はまた、Pythonの2.7のために、この唯一の作品のように思える - Pythonの3.6での再試行は、痛みを少しnumbs。 gRPCを無効

は、Python 3.6のためのトリックん - これは環境変数を設定することによって行うことができます。

ENV GOOGLE_CLOUD_DISABLE_GRPC=true 
0

私は「とてもきれいではない」の回避策を得るために管理します。締め切りのコードを複製するポリシーを使用すると、google.cloud.pubsub_v1.subscriber.policy.thread.Policy.on_exceptionに上書きされます。私は

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

問題のようなコードを持っているメッセージの受信機能をオン

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) 

は、リソースは、それが本当に利用できない場合、我々は認識していないだろうということです。しかし、GRPC開発チームはこの問題を解決するために管理していますが、この回避策を使用します。

関連する問題