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 中创建主题订阅时出错

Google PubSub Request 消息即使确认?

确保在第一个订阅者完成拉入 Google pub-sub 主题后触发第二个订阅者

Google Pub/Sub 分区 ID

您可以使用 Google Pub Sub 批量提取消息吗?