Клиент BigQuery Python — значение параметра timeout и как установить тайм-аут результата запроса

#python #google-bigquery #google-cloud-python

#питон #google-bigquery #google-облако-python

Вопрос:

Этот вопрос касается timeout параметра в result методе объектов QueryJob в клиенте BigQuery Python.

Похоже, что значение timeout изменилось по отношению к версии 1.24.0.

Например, в документации для QueryJob result в версии 1.24.0 указано, что тайм-аут равен:

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

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

Например, рассмотрим следующий скрипт:

 import logging

from google.cloud import bigquery

# Set logging level to DEBUG in order to see the HTTP requests
# being made by urllib3
logging.basicConfig(level=logging.DEBUG)

PROJECT_ID = "project_id" # replace by actual project ID

client = bigquery.Client(project=PROJECT_ID)

QUERY = ('SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
        'WHERE state = "TX" '
        'LIMIT 100')
TIMEOUT = 30  # in seconds
query_job = client.query(QUERY)  # API request - starts the query
assert query_job.state == 'RUNNING'

# Waits for the query to finish
iterator = query_job.result(timeout=TIMEOUT)
rows = list(iterator)

assert query_job.state == 'DONE'
  

Насколько я понимаю, если все вызовы API, участвующие в получении результатов, в сумме составляют более 30 секунд, вызов result завершится. Таким образом, timeout здесь используется для ограничения общего времени выполнения result вызова метода.

Однако в более поздних версиях были внесены изменения. Например, в документации для result в 1.27.2 указано, что время ожидания равно:

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

Если я правильно понимаю это, приведенный выше пример полностью меняет смысл, и вызов result потенциально может занять более 30 секунд.

Мои сомнения заключаются в следующем:

  1. В чем именно разница в приведенном выше скрипте, если я запускаю его с новой версией result по сравнению со старой версией?
  2. Каковы в настоящее время рекомендуемые варианты использования для передачи timeout значения result ?
  3. Каков рекомендуемый в настоящее время способ тайм-аута по истечении заданного общего времени ожидания результатов запроса?

Спасибо.

Комментарии:

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

Ответ №1:

Как вы можете видеть в этом исправлении:

Тайм-аут транспортного уровня не зависит от тайм-аута запроса, то есть максимального времени ожидания завершения запроса.

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

  • Применяйте тайм-аут к каждому из базовых запросов

Поскольку методы задания больше не разделяют время ожидания между всеми запросами, которые может выполнять метод, методы клиента настраиваются таким же образом.

Итак, основное отличие заключается в том, что в предыдущей версии, если на уровне ниже было сделано много запросов, они разделяли бы тайм-аут в 30 секунд. Другими словами, если первый запрос занимает 20 секунд, то второй истекает через 10 секунд. В новой версии на каждый отдельный запрос будет отводиться 30 секунд.

Что касается варианта использования, в основном это зависит от вашего приложения. Если вы не можете долго ждать запроса, который может быть потерян, вы можете уменьшить время ожидания.