google-cloud-pubsub - 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}')
解决方案
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()
您可以循环执行此操作,并防止您的进程打开太多文件:)
推荐阅读
- css - svg stroke-dashoffset 百分比值的基础是什么
- algorithm - 是否可以对 hyperloglog 进行去重,以便添加和删除元素会产生相对正确的唯一计数?
- express - 为什么我的密码没有被散列?
- html - 如何让一个班级有三种不同的颜色?
- java - 自定义属性不能在 Spring Boot 中注入
- spring - 如何在 Spring 的 @Meta 注释中动态分配值
- scala - Scala当我有两个键时如何使用reduceBykey
- android - Android 模拟器 Play 商店 - 无法从 Play 商店下载应用程序
- oracle - plsql 获取每个标题的最大序列行,并使用特定标题的下一个序列号更新列的空值
- typescript2.0 - 以结构化方式将项目推送到打字稿中的数组