Обработка ошибок
При использовании YDB SDK возникают ситуации, в которых необходимо обрабатывать ошибки.
Ошибки можно разделить на три категории:
-
Временные сбои (retryable). Включают кратковременную потерю сетевого соединения, временную недоступность или перегруженность одной из подсистем YDB, а также неспособность YDB ответить на запрос в течение установленного времени ожидания. В случае возникновения таких ошибок повторный запрос через некоторый промежуток времени с высокой вероятностью будет выполнен успешно.
-
Ошибки, которые не могут быть исправлены с помощью повтора (non-retryable). Включают некорректно сформированные запросы, внутренние ошибки YDB, а также запросы, не соответствующие схеме данных. В такой ситуации нет необходимости повторять запрос, требуется дополнительное вмешательство разработчика.
-
Ошибки, которые, предположительно, могут быть исправлены с помощью повтора после реакции клиентского приложения (conditionally retryable). Возникают при идемпотентных операциях, таких как отсутствие ответа в течение отведённого времени или запрос аутентификации.
Обработка временных сбоев (retryable errors)
YDB SDK предоставляет встроенный механизм обработки временных сбоев. По умолчанию в SDK используется рекомендованная политика повторов, которую можно изменить в соответствии с требованиями клиентского приложения. YDB возвращает коды завершения, позволяющие определить, уместна ли повторная попытка и какой выбрать интервал.
Операции следует повторять только в том случае, если ошибки являются временными сбоями. Не пытайтесь повторно выполнять недопустимые операции, такие как вставка в таблицу строки с существующим значением первичного ключа или вставка данных, не соответствующих схеме таблицы.
Крайне важно оптимизировать число повторных попыток и интервал между ними. Чрезмерное количество повторных попыток и слишком короткий интервал создают избыточную нагрузку. Недостаточное количество повторных попыток не позволит завершить выполнение операции.
Встроенные в SDK YDB retryer'ы используют следующие стратегии задержек повторного выполнения запросов в зависимости от статуса завершения запроса:
- Немедленный повтор. Повторные попытки совершаются немедленно.
- Короткая экспоненциальная задержка. Первоначальный интервал составляет несколько миллисекунд. Для каждой последующей попытки интервал увеличивается по экспоненциальному закону.
- Большая экспоненциальная задержка. Первоначальный интервал составляет несколько секунд. Для каждой последующей попытки интервал увеличивается по экспоненциальному закону.
При выборе интервала вручную обычно используются следующие стратегии:
- Экспоненциальная задержка. Для каждой последующей попытки интервал увеличивается по экспоненциальному закону.
- Интервалы с приращениями. Для каждой последующей попытки интервал увеличивается с определёнными приращениями.
- Постоянные интервалы. Повторные попытки совершаются через одинаковые интервалы.
- Немедленный повтор. Повторные попытки совершаются немедленно.
- Случайный выбор. Повторные попытки совершаются через случайно выбранный интервал времени.
При выборе интервала и числа повторных попыток учитывайте статусы завершения YDB.
Не используйте бесконечные повторные попытки — это может привести к избыточной нагрузке.
Не выполняйте немедленный повтор более одного раза.
Примеры кода смотрите в разделе Выполнение повторных попыток.
Статусы завершения
Когда возникает ошибка, YDB SDK возвращает объект ошибки, который включает статусы завершения. Возвращаемый статус завершения может исходить от сервера YDB, транспорта gRPC или самого SDK.
Статусы завершения в диапазоне 400000–400999 — это статусы завершения, полученные от сервера YDB. Смотрите Статусы завершения сервера YDB.
Статусы завершения в диапазоне 401000–401999 относятся к кодам, специфичным для SDK. Для получения дополнительной информации об этих статусах, относящихся к конкретному SDK, обратитесь к соответствующей документации SDK.
Для получения дополнительной информации о статусах завершения gRPC см. документацию gRPC.
Журналирование ошибок
При использовании SDK рекомендуется записывать в журнал все ошибки и исключения:
- Журналируйте количество предпринимаемых повторных попыток. Увеличение числа регулярных повторных попыток часто указывает на наличие проблем.
- Журналируйте все ошибки, в том числе их типы, коды завершения и причины возникновения.
- Журналируйте общее время выполнения операций, включая операции, завершившиеся после повторного выполнения.