Google pubsub_v1 订阅者拉“打开的文件太多”
Posted
技术标签:
【中文标题】Google pubsub_v1 订阅者拉“打开的文件太多”【英文标题】:Google pubsub_v1 subscriber pull "too many files open" 【发布时间】:2019-09-26 18:17:15 【问题描述】:好像有问题 谷歌-云-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)
files 保持打开状态并最终导致“打开的文件过多”问题。
问题似乎不在于 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]:call 中的文件“/opt///lib/python3.6/site-packages/grpc/_channel.py”,第 562 行 5 月 8 日 22:34:41 .sh[17736]: return _end_unary_response_blocking(state, call, False, None) 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 .sh statuscode.unavailable invalid jwt signature. error_description cc> 5 月 8 日 22:34:41 .sh[17736]:上述异常是以下异常的直接原因: 5 月 8 日 22:34:41 .sh[17736]:回溯(最后一次通话): 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) 5 月 8 日 22:34:41 .sh[17736]:文件“/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 行,拉中 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 行,在 call 5 月 8 日 22:34:41 .sh[17736]: return 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]: return 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]: 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: Invalid JWT Signature.', '\n "error": "invalid_grant ",\n "error_description": "无效的 JWT 签名。"\n')
【问题讨论】:
【参考方案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()
您可以循环执行此操作,并防止您的进程打开太多文件:)
【讨论】:
以上是关于Google pubsub_v1 订阅者拉“打开的文件太多”的主要内容,如果未能解决你的问题,请参考以下文章
google.cloud.pubsub_v1 和 google.cloud.pubsub 有啥区别?
尝试在 Google PubSub python 中创建主题订阅时出错