В запросе «Создать задачу» облачных задач Google выбрасывается значение ServiceUnavailable: 503 - PullRequest
0 голосов
/ 06 марта 2020

Я конвертирую свои задачи из AppEngine TaskQueues в облачные задачи Google.

У меня возникают проблемы - почасовое задание cron, которое проверяет S3 Bucket на наличие новых файлов. Задание cron запускает новую задачу для каждого найденного файла. Затем эти задачи загружают свои соответствующие файлы и запускают новую задачу для каждой записи в своем файле.

Если во время этого разветвления некоторые вызовы create_task() завершаются неудачно с ServiceUnavailable: 503 (https://googleapis.dev/python/cloudtasks/latest/gapic/v2/api.html#google .cloud.tasks_v2.CloudTasksClient.create_task )

Вот один

Traceback (most recent call last):
  ...
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/src/utils/gc_tasks.py", line 72, in _gc_create_task
    _ = _tasks_client.create_task(parent=_queue_path(DEFAULT_QUEUE), task=task)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/cloud/tasks_v2/gapic/cloud_tasks_client.py", line 1512, in create_task
    request, retry=retry, timeout=timeout, metadata=metadata
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/gapic_v1/method.py", line 143, in __call__
    return wrapped_func(*args, **kwargs)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/retry.py", line 273, in retry_wrapped_func
    on_error=on_error,
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/retry.py", line 182, in retry_target
    return target()
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/timeout.py", line 214, in func_with_timeout
    return func(*args, **kwargs)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/ebb3af67a06047b6/python27/python27_lib/versions/third_party/six-1.12.0/six/__init__.py", line 737, in raise_from
    raise value
ServiceUnavailable: 503 {
    "created":"@1583436423.131570193",
    "description":"Delayed close due to in-progress write",
    "file":"third_party/apphosting/python/grpcio/v1_0_0/src/core/ext/transport/chttp2/transport/chttp2_transport.c",
    "file_line":412,
    "grpc_status":14,
    "referenced_errors":[{
        "created":"@1583436423.131561040",
        "description":"OS Error",
        "errno":32,
        "file":"third_party/apphosting/python/grpcio/v1_0_0/src/core/lib/iomgr/tcp_posix.c",
        "file_line":393,
        "os_error":"Broken pipe",
        "syscall":"sendmsg"}
    ]}

Вот еще один

Traceback (most recent call last):
  ...
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/src/utils/pt_gc_tasks.py", line 72, in _gc_create_task
    _ = _tasks_client.create_task(parent=_queue_path(DEFAULT_QUEUE), task=task)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/cloud/tasks_v2/gapic/cloud_tasks_client.py", line 1512, in create_task
    request, retry=retry, timeout=timeout, metadata=metadata
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/gapic_v1/method.py", line 143, in __call__
    return wrapped_func(*args, **kwargs)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/retry.py", line 273, in retry_wrapped_func
    on_error=on_error,
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/retry.py", line 182, in retry_target
    return target()
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/timeout.py", line 214, in func_with_timeout
    return func(*args, **kwargs)
  File "/base/data/home/apps/s~my_project/dev.XXXXXXXXXXXXXXXXXXX/lib/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/ebb3af67a06047b6/python27/python27_lib/versions/third_party/six-1.12.0/six/__init__.py", line 737, in raise_from
    raise value
ServiceUnavailable: 503 {
    "created":"@1583407622.505288938",
    "description":"Endpoint read failed",
    "file":"third_party/apphosting/python/grpcio/v1_0_0/src/core/ext/transport/chttp2/transport/chttp2_transport.c",
    "file_line":1807,
    "grpc_status":14,
    "occurred_during_write":0,
    "referenced_errors":[{
        "created":"@1583407622.505108366",
        "description":"Secure read failed",
        "file":"third_party/apphosting/python/grpcio/v1_0_0/src/core/lib/security/transport/secure_endpoint.c",
        "file_line":158,
        "referenced_errors":[{
            "created":"@1583407622.505106550",
            "description":"Socket closed",
            "file":"third_party/apphosting/python/grpcio/v1_0_0/src/core/lib/iomgr/tcp_posix.c",
            "file_line":259}
        ]}
    ]}

Я ставлю слишком много задач в то же время? Что я могу сделать, чтобы справиться с этим?

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

После нескольких копаний кажется, что «503 Сервис недоступен» - довольно распространенная ошибка в SDK Google Cloud для всех сервисов GCP.

Решение состоит в том, чтобы включить логи повторных попыток c. У google-cloud-core (от которого зависит google-cloud-tasks) есть существующий механизм повторных попыток, но он не был настроен для создания задачи.

retry_codes_name был установлен на non_idempotent вместо idempotent

            "CreateTask": {
                "timeout_millis": 10000,
                "retry_codes_name": "non_idempotent",
                "retry_params_name": "default",
            },

https://github.com/googleapis/python-tasks/blob/100e9c709383848498e1e6a747fb819520a7d8c1/google/cloud/tasks_v2/gapic/cloud_tasks_client_config.py#L87

Я предполагаю, что это может привести к постановке дубликатов задач. Но если вы укажете имя задачи, google-cloud-tasks не позволит поставить эти дубликаты в очередь.

Итак, я передал объект Retry в .create_task() без указания аргумента для predicate, в результате чего по умолчанию он становится равным if_transient_error(), что будет повторять при следующих ошибках: exceptions.InternalServerError, exceptions.TooManyRequests, exceptions.ServiceUnavailable

Ниже приведен фрагмент моего кода для создания задач

from google.api_core import retry
from google.api_core.exceptions import AlreadyExists
from google.cloud import tasks

_tasks_client = tasks.CloudTasksClient()


def my_create_task_function(my_queue_path, task_object):
    try:
        _tasks_client.create_task(
            parent=my_queue_path, 
            task=task_object, 
            retry=retry.Retry(  # Copies the default retry config from retry_params in google.cloud.tasks_v2.gapic.cloud_tasks_client_config
                initial=.1,
                maximum=60,
                multiplier=1.3,
                deadline=600))
    except AlreadyExists:
        logging.warn("found existing task")

Существует также доступный регистратор, который позволяет настроить уровень, чтобы вы могли видеть операторы журнала когда он на самом деле делает попытку.

Если вы сделаете следующее:

logging.getLogger('google.api_core.retry').setLevel(logging.DEBUG)

После этого вы должны увидеть подобные сообщения в своих логах:

enter image description here

1 голос
/ 06 марта 2020

Обе ошибки, которыми вы поделились, по-видимому, имеют разные причины, чем текст в их описании, но обе они действительно могут быть связаны с перегрузкой задач в вашей очереди.

Что вы можете сделать, чтобы обойти это установить некоторые ограничения скорости, чтобы снизить нагрузку, или вы можете установить параметры повтора, поскольку, очевидно, это происходит только с несколькими задачами. В любом случае вы выберете go, и вы можете найти, как это сделать, в Документация очереди по настройке облачных задач .

0 голосов
/ 09 марта 2020

Ошибка HTTP 503. Служба недоступна, возникает, если пул приложений соответствующего приложения Wep остановлен, отключен или приостановлен. или Указанный идентификатор пользователя пула приложений может быть недействительным из-за истекшего пароля или заблокирован.

...