Google pubsub_v1订阅者将“打开太多文件”

时间:2019-05-09 00:01:27

标签: google-cloud-pubsub grpc-python

似乎有一个问题 google-cloud-pubsub == 0.39.1 google-api-python-client == 1.7.8

当凭据失效时,在循环中进行拉入会导致大量python3 1456 root 71u IPv4 46501 0t0 TCP XXX-XXXXX-XXXX:47074->YYYYYYYY-YY-YYYYY.1e100.net:https (CLOSE_WAIT)个文件保持打开状态,并最终导致“打开文件过多”的问题。

问题似乎不是在pubsub本身,而是在gRPC中。

  

5月8日22:34:41 .sh [17736]:回溯(最近一次通话结束):   5月8日22:34:41 .sh [17736]:文件“ /opt////lib/python3.6/site-packages/google/api_core/grpc_helpers.py”,第57行,在error_remapped_callable中   5月8日22:34:41 .sh [17736]:返回callable _(* args,** kwargs)   5月8日22:34:41 .sh [17736]:调用中的文件“ /opt///lib/python3.6/site-packages/grpc/_channel.py”,第562行   5月8日22:34:41 .sh [17736]:返回_end_unary_response_blocking(状态,调用,错误,无)   5月8日22:34:41 .sh [17736]:文件_end_unary_response_blocking中的文件“ /opt////lib/python3.6/site-packages/grpc/_channel.py”,第466行   5月8日22:34:41 .sh [17736]:提高_Rendezvous(状态,无,无,截止日期)   5月8日22:34:41 .sh [17736]:grpc._channel._Rendezvous:<_的RPC的终止于:   5月8日22:34:41 .sh [17736]:#011status = StatusCode.UNAVAILABLE   5月8日22:34:41 .sh [17736]:#011details =“从插件获取元数据失败,并显示以下错误:('invalid_grant:无效的JWT签名。','{\ n” error“:” invalid_grant“,\ n” error_description“:“无效的JWT签名。” \ n}')“   5月8日22:34:41 .sh [17736]:#011debug_error_string =“ {” created“:” @@ 1557354881.258250528“,” description“:”从插件获取元数据失败,并显示以下错误:('invalid_grant:无效的JWT签名。', '{\ n“ error”:“ invalid_grant”,\ n“ error_description”:“无效的JWT签名。” \ n}')“,” file“:” src / core / lib / security / credentials / plugin / plugin_credentials。 cc“,” file_line“:79,” grpc_status“:14}”   5月8日22:34:41 .sh [17736]:>   5月8日22:34:41 .sh [17736]:上面的异常是以下异常的直接原因:   5月8日22:34:41 .sh [17736]:回溯(最近一次通话过去):   5月8日22:34:41 .sh [17736]:在subscribeToStuff中的文件“ /opt////lib/python3.6/site-packages/lt/cloud/cloudpull.py”,第113行   5月8日22:34:41 .sh [17736]:pull_response = Subscriber.pull(订阅路径,max_messages = NUM​​_MESSAGES,超时= 60,重试=无)   5月8日22:34:41 .sh [17736]:在第45行中输入文件“ /opt///lib/python3.6/site-packages/google/cloud/pubsub_v1/_gapic.py”   5月8日22:34:41 .sh [17736]:fx = lambda self,* a,** kw:wrapped_fx(self.api,* a,** kw)#noqa   5月8日22:34:41 .sh [17736]:文件“ /opt////lib/python3.6/site-packages/google/cloud/pubsub_v1/gapic/subscriber_client.py”,行860,在下拉列表中   5月8日22:34:41 .sh [17736]:请求,重试=重试,超时=超时,元数据=元数据   5月8日22:34:41 .sh [17736]:在通话<中,文件“ /opt////lib/python3.6/site-packages/google/api_core/gapic_v1/method.py”,第143行/ strong>   5月8日22:34:41 .sh [17736]:返回wrapd_func(* args,** kwargs)   5月8日22:34:41 .sh [17736]:在func_with_timeout中,文件“ /opt////lib/python3.6/site-packages/google/api_core/timeout.py”,第102行   5月8日22:34:41 .sh [17736]:返回函数(* args,** kwargs)   5月8日22:34:41 .sh [17736]:文件“ /opt////lib/python3.6/site-packages/google/api_core/grpc_helpers.py”,第59行,在error_remapped_callable中   5月8日22:34:41 .sh [17736]:six.raise_from(exceptions.from_grpc_error(exc),exc)   5月8日22:34:41 .sh [17736]:文件“”,第3行,位于raise_from   5月8日22:34:41 .sh [17736]:google.api_core.exceptions.ServiceUnavailable:503从插件获取元数据失败,并显示错误:(“'invalid_grant:无效的JWT签名。','{\ n“ error”:“ invalid_grant “,\ n” error_description“:”无效的JWT签名。“ \ n}')

1 个答案:

答案 0 :(得分:1)

https://github.com/googleapis/google-cloud-python/issues/5523

底部client.api.transport._channel.close()

的通知

pubsub_v1.SubscriberClient属于客户类别。

所以你可以做...

subscriber = pubsub_v1.SubscriberClient(credentials=credentials)
try:
    subscription_path = subscriber.subscription_path(project, subscription)
    pull_response = subscriber.pull(subscription_path, max_messages=NUM_MESSAGES, timeout=60, retry=None)
    for msg in pull_response.received_messages:
        #do stuff
finally:
    subscriber.api.transport._channel.close()

您可以循环执行此操作,以防止您的进程打开太多文件:)