Google Cloud Tasks HTTP触发器-如何禁用重试

时间:2019-09-26 13:07:43

标签: google-cloud-platform google-cloud-tasks

我正在尝试创建一个Cloud Tasks队列,该任务在HTTP任务失败时永远不会重试。

根据documentation,maxAttempts应该是我要寻找的:

  

每个任务的尝试次数。

     

Cloud Tasks将尝试任务maxAttempts次(即,如果   第一次尝试失败,然后将出现maxAttempts-1次重试)。必须   是> = -1。

因此,如果maxAttempts为1,则应重试0次。

但是,例如,如果我跑步

gcloud tasks queues create test-queue --max-attempts=1 --log-sampling-ratio=1.0

然后使用以下Python代码创建HTTP任务:

from google.cloud import tasks_v2beta3
from google.protobuf import timestamp_pb2
client = tasks_v2beta3.CloudTasksClient()
project = 'project_id' # replace by real project ID
queue = 'test-queue'
location = 'us-central1'
url = 'https://example.com/task_handler' # replace by some endpoint that return 5xx status code
parent = client.queue_path(project, location, queue)
task = {
        'http_request': {  # Specify the type of request.
            'http_method': 'POST',
            'url': url  # The full url path that the task will be sent to.
        }
}
response = client.create_task(parent, task)
print('Created task {}'.format(response.name))

在队列的Stackdriver日志中(由于我在创建队列时使用了--log-sampling-ratio=1.0,因此可以看到它),该任务显然被重试了一次:一次调度尝试,然后是状态为UNAVAILABLE的调度响应,然后是另一次调度尝试,最后是最后一个调度响应(也表示“不可用”)。

有什么办法可以重试0次?

注意

关于maxAttempts,文档还显示:

  

此字段的含义与queue.yaml / xml中的task_retry_limit相同。

但是,当我进入description for task_retry_limit时,它说:

  

重试次数。例如,如果指定0且任务   失败,则根本不会重试该任务。如果指定1并且任务   失败,任务将重试一次。如果未指定此参数,则   任务将无限期重试。如果将task_retry_limit指定为   task_age_limit,直到重试两个任务为止。

这似乎与maxAttempts的描述不一致,因为它表明如果参数为1,则将重试一次任务。

我尝试将maxAttempts设置为0,但这似乎使它假定默认值为100。

谢谢。

1 个答案:

答案 0 :(得分:1)

正如@ averi-kitsch所提到的,这是当前内部问题,我们的Cloud Tasks工程师团队目前正在处理此问题,可惜我们还没有任何ETA。

您可以使用此Public Issue Tracker跟踪此问题的进展,单击“星号”以订阅它并接收以后的更新。

作为一种变通方法,如果您不希望任务失败后重试,请直接在queue.yaml上设置“ task_retry_limit = 0 ”。

示例:

   Container(
        alignment: Alignment.centerLeft,
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.circular(10.0),
          boxShadow: [
            BoxShadow(
              color: Colors.black12,
              blurRadius: 6.0,
              offset: Offset(0, 2),
            ),
          ],
        ),
        height: 60.0,
        child: DropdownButtonFormField(
           decoration: InputDecoration(
            border: InputBorder.none,
            prefixIcon: Icon(
              Icons.location_city,
              color: Colors.black,
            )
          ),
          items: states.map((String dropDownStringItem) {
            return DropdownMenuItem<String>(
              value: dropDownStringItem,
              child: Text(dropDownStringItem),
            );
          }).toList(),
          onChanged: (value) {
            setState(() {
              print(value);
            });
          },
        ),
      ),