首页 > 解决方案 > Google pubsub_v1 订阅者拉“打开的文件太多”

问题描述

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]:文件“/opt///lib/python3.6/ site-packages/grpc/_channel.py”,第 466 行,在 _end_unary_response_blocking 5 月 8 日 22:34:41 .sh[17736]:提高 _Rendezvous(状态,无,无,截止日期)5 月 8 日 22:34:41 .sh[ 17736]:grpc._channel._Rendezvous:<_Rendezvous 的 RPC 终止于:5 月 8 日 22:34:41 .sh[17736]:#011status = StatusCode.UNAVAILABLE 5 月 8 日 22:34:41 .sh[17736]:# 011details = "从插件获取元数据失败并出现错误: ('invalid_grant: Invalid JWT Signature.', '{\n "error": "invalid_grant",\n "error_description": "Invalid JWT Signature."\n}') " 5 月 8 日 22:34:41 .sh[17736]:#011debug_error_string = "{"created":"@1557354881.258250528","description":"从插件获取元数据失败并出现错误:('invalid_grant: Invalid JWT Signature.', '{\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]: > May 8 22:34:41 .sh[17736]: 上述异常是以下异常的直接原因:May 8 22:34:41 .sh[17736]: Traceback (最近一次通话最后):5 月 8 日 22:34:41 .sh[17736]:文件“/opt///lib/python3.6/site-packages/lt/cloud/cloudpull.py”,第 113 行,在subscribeToStuff 5 月 8 日 22:34:41 .sh[17736]:pull_response =subscriber.pull(subscription_path, max_messages=NUM_MESSAGES, timeout=60, retry=None) May 8 22:34:41 .sh[17736]: File "/opt///lib/python3.6/site-packages/ google/cloud/pubsub_v1/_gapic.py",第 45 行,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 行, 在 pull May 8 22:34:41 .sh[17736]: request, retry=retry, timeout=timeout, metadata=metadata May 8 22:34:41 .sh[17736]: File "/opt///lib /python3.6/site-packages/google/api_core/gapic_v1/method.py”,第 143 行,在/opt///lib/python3.6/site-packages/google/cloud/pubsub_v1/_gapic.py”,第 45 行,5 月 8 日 22:34:41 .sh[17736]: fx = lambda self, *a , **kw: Wrapped_fx(self.api, *a, **kw) # noqa May 8 22:34:41 .sh[17736]: File "/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 行,在/opt///lib/python3.6/site-packages/google/cloud/pubsub_v1/_gapic.py”,第 45 行,5 月 8 日 22:34:41 .sh[17736]: fx = lambda self, *a , **kw: Wrapped_fx(self.api, *a, **kw) # noqa May 8 22:34:41 .sh[17736]: File "/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 行,在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 行,在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 行,在调用 5 月 8 日 22:34:41 .sh[17736]:返回 Wrapped_func(*args, **kwargs) 5 月 8 日 22:34:41 .sh[17736]:文件“/opt///lib/python3.6/ site-packages/google/api_core/timeout.py",第 102 行,在 func_with_timeout 5 月 8 日 22:34:41 .sh[17736]:返回 func(*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]:六。 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: Invalid JWT Signature.', '{\n "error": "invalid_grant",\n "error_description": "无效的 JWT 签名。"\n}')

标签: google-cloud-pubsubgrpc-python

解决方案


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

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

Apubsub_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()

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


推荐阅读