Повторные запросы к API (auto-retry
)
Плагин auto-retry — это все, что нужно для борьбы с ограниениями флуда, то есть ошибками с кодом 429. Его можно использовать для каждого бота во время обычной работы, но он особенно пригодится во время трансляции сообщений.
Этот плагин представляет собой трансформирующую функцию API, что означает, что он позволяет перехватывать и изменять исходящие HTTP-запросы на лету. Конкретнее, этот плагин автоматически определяет, если API-запрос не выполняется со значением retry
, т.е. из-за ограничения скорости. Он перехватит ошибку, подождет указанный период времени, а затем повторит запрос.
В дополнение к обработке ограничения скорости, этот плагин повторит запрос, если он завершился с внутренней ошибкой сервера, т.е. ошибкой с кодом 500 или больше. Сетевые ошибки (те, которые выдают Http
в grammY) также будут вызывать повторную попытку. Повторное выполнение таких запросов - более-менее единственно разумная стратегия обработки этих двух типов ошибок. Поскольку ни одна из них не предоставляет значения retry
, плагин использует экспоненциальный откат, начинающийся с 3 секунд и ограничивающийся одним часом.
Установка
Вы можете установить этот плагин на объект bot
:
import { autoRetry } from "@grammyjs/auto-retry";
// Использование плагина.
bot.api.config.use(autoRetry());
2
3
4
const { autoRetry } = require("@grammyjs/auto-retry");
// Использование плагина.
bot.api.config.use(autoRetry());
2
3
4
import { autoRetry } from "https://deno.land/x/grammy_auto_retry@v2.0.2/mod.ts";
// Использование плагина.
bot.api.config.use(autoRetry());
2
3
4
Если вы вызовете, например, send
и столкнетесь с ограничением скорости, это будет выглядеть, как будто запрос выполняется необычно долго. На самом деле, выпоняется несколько HTTP-запросов с соответствующими задержками между ними.
Настройка
Вы можете передать объект options, указывающий максимальное количество повторных попыток (max
) или порог максимального времени ожидания (max
).
Ограничение повторов
Как только максимальное количество повторных попыток будет исчерпано, последующие ошибки для того же запроса не будут повторены. Вместо этого передается объект ошибки из Telegram, что фактически приводит к неудачному запросу с ошибкой Grammy
.
Аналогично, если запрос когда-либо завершится с retry
больше, чем указано в опции max
, запрос завершится немедленно.
autoRetry({
maxRetryAttempts: 1, // повторяйте запросы только один раз
maxDelaySeconds: 5, // немедленно остановится, если приходится ждать больше 5 секунд
});
2
3
4
Повторный запрос ошибок внутреннего сервера
Вы можете использовать rethrow
, чтобы отказаться от обработки внутренних ошибок сервера, как описано выше. Опять же, передается объект ошибки от Telegram, что фактически приводит к отказу запроса с Grammy
.
autoRetry({
rethrowInternalServerErrors: true, // не обрабатывать внутренние ошибки сервера
});
2
3
Повторный запрос сетевых ошибок
Вы можете использовать rethrow
, чтобы отказаться от обработки сетевых ошибок, как описано выше. Если это включено, то брошенные экземпляры Http
будут переданы, не выполнив запрос.
autoRetry({
rethrowHttpErrors: true, // не обрабатывать сетевые ошибки
});
2
3