【问题标题】:Google Cloud Tasks 'Create Task' request is throwing ServiceUnavailable: 503谷歌云任务“创建任务”请求抛出 ServiceUnavailable:503
【发布时间】:2020-06-18 16:47:15
【问题描述】:

我正在将我的任务从 AppEngine TaskQueues 转换为 Google Cloud Tasks。

有一个问题是每小时检查一个 S3 存储桶的新文件的 cron 作业。 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}
        ]}
    ]}

我是否同时将太多任务排入队列?我该怎么办?

【问题讨论】:

    标签: google-app-engine google-cloud-python google-cloud-tasks


    【解决方案1】:

    您分享的两个错误的原因似乎与其描述中的文字不同,但确实可能与您队列中的任务超载有关。

    您可以做的解决方法是设置一些速率限制以降低负载,或者您可以设置重试参数,因为显然它只发生在少数任务上。无论您选择哪种方式,您都可以在Cloud Task Configuring Queue Documentation 中找到方法。

    【讨论】:

    • 所以页面确实提到了 503 错误,但那是在工作人员试图消费/处理任务而不是任务排队的情况下,对吗?设置速率限制会影响队列将任务传递给工作人员的速度,并且不会阻止这些崩溃的发生。
    • @Alex,您是对的,但是,在这种情况下,重试机制仍然能够解决您的问题,因为这些错误的出现方式似乎是随机的。
    • 谷歌云任务库应该内置了重试逻辑,这是他们的默认配置:github.com/googleapis/python-tasks/blob/master/google/cloud/…我会尝试深入了解它的实际应用情况跨度>
    • 在摆弄了谷歌云任务源代码后,我意识到重试逻辑并没有开始调用create_task() 我猜这是因为如果你不指定task_name,那么重复的任务可以生成。当我对它感到满意时,我会发布我的解决方案
    【解决方案2】:

    HTTP 错误 503。如果相应的 Wep 应用程序的应用程序池被停止或禁用或暂停,则服务不可用。或者由于密码过期或被锁定,应用程序池的给定用户身份可能无效。

    【讨论】:

      【解决方案3】:

      经过大量挖掘,“503 Service Unavailable”似乎是所有 GCP 服务的 google-cloud SDK 中非常常见的错误。

      解决方案是启用重试逻辑。 google-cloud-coregoogle-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.InternalServerErrorexceptions.TooManyRequests、@ 987654340@

      下面是我创建任务的代码的 sn-p

      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)
      

      当它启动时,您应该会在日志中看到类似这样的消息:

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多