Подписчик Google pubsub_v1 «слишком много файлов открыт» - PullRequest
1 голос
/ 09 мая 2019

Кажется, проблема в Google облако-PubSub == 0.39.1 Google-апи-питон-клиент == 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.

8 мая 22:34:41 .sh [17736]: обратная связь (последний вызов был последним): 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/api_core/grpc_helpers.py", строка 57, в error_remapped_callable 8 мая 22:34:41 .sh [17736]: возвращаемая функция _ (* args, ** kwargs) 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/grpc/_channel.py", строка 562, в вызов 8 мая 22:34:41 .sh [17736]: return _end_unary_response_blocking (состояние, вызов, ложь, нет) 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/grpc/_channel.py", строка 466, в _end_unary_response_blocking 8 мая 22:34:41 .sh [17736]: повышение _Rendezvous (состояние, нет, нет, крайний срок) 8 мая 22:34:41 .sh [17736]: grpc._channel._Rendezvous: <_Rendezvous для RPC, завершившегося символом: 8 мая 22:34:41 .sh [17736]: # 011status = StatusCode.UNAVAILABLE 8 мая 22:34:41 .sh [17736]: # 011details = "Не удалось получить метаданные из плагина с ошибкой: ('invalid_grant: неверная подпись JWT.', '{\ N" error ":" invalid_grant ", \ n" error_description ":" Недопустимая подпись JWT. "\ n} ')" 8 мая 22:34:41 .sh [17736]: # 011debug_error_string = "{" созданный ":" @ 1557354881.258250528 "," description ":" Ошибка получения метаданных из плагина: ('invalid_grant: недопустимая подпись JWT.', '{\ n "error": "invalid_grant", \ n "error_description": "Invalid JWT Signature." \ n}') "," file ":" src / core / lib / security / credentials / plugin / plugin_credentials. сс " "file_line": 79, "grpc_status": 14}" 8 мая 22:34:41 .sh [17736]:> 8 мая 22:34:41 .sh [17736]: Вышеуказанное исключение было прямой причиной следующего исключения: 8 мая 22:34:41 .sh [17736]: обратная связь (последний вызов был последним): 8 мая 22:34:41 .sh [17736]: Файл "/opt///lib/python3.6/site-packages/lt/cloud/cloudpull.py", строка 113, в subscribeToStuff 8 мая 22:34:41 .sh [17736]: pull_response = subscriber.pull (subscription_path, max_messages = NUM_MESSAGES, тайм-аут = 60, повтор = Нет) 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/cloud/pubsub_v1/_gapic.py", строка 45, в 8 мая 22:34:41 .sh [17736]: fx = лямбда-сам, * a, ** квт: wrapped_fx (self.api, * а, ** квт) # noqa 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/cloud/pubsub_v1/gapic/subscriber_client.py", строка 860, в режиме ожидания 8 мая 22:34:41 .sh [17736]: запрос, повтор = повтор, тайм-аут = тайм-аут, метаданные = метаданные 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/api_core/gapic_v1/method.py", строка 143, в call 8 мая 22:34:41 .sh [17736]: вернуть wrapped_func (* args, ** kwargs) 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/api_core/timeout.py", строка 102, в func_with_timeout 8 мая 22:34:41 .sh [17736]: функция возврата (* args, ** kwargs) 8 мая 22:34:41 .sh [17736]: файл "/opt///lib/python3.6/site-packages/google/api_core/grpc_helpers.py", строка 59, в error_remapped_callable 8 мая 22:34:41 .sh [17736]: six.raise_from (exceptions.from_grpc_error (exc), exc) 8 мая 22:34:41 .sh [17736]: файл "", строка 3, в Raise_from 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 Ответ

1 голос
/ 09 мая 2019

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

Уведомление внизу client.api.transport._channel.close()

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

Вы можете сделать это в цикле и не дать процессу открывать слишком много файлов:)

...