Files
telegram-helper-bot/RATE_LIMITING_SOLUTION.md
Andrey 5f6882d348 Implement audio record management features in AsyncBotDB and AudioRepository
- Added methods to delete audio moderation records and retrieve all audio records in async_db.py.
- Enhanced AudioRepository with functionality to delete audio records by file name and retrieve all audio message records.
- Improved logging for audio record operations to enhance monitoring and debugging capabilities.
- Updated related handlers to ensure proper integration of new audio management features.
2025-09-05 01:31:50 +03:00

8.0 KiB
Raw Permalink Blame History

Решение проблемы Flood Control в Telegram Bot

Проблема

В логах бота наблюдались ошибки типа:

Flood control exceeded on method 'SendVoice' in chat 1322897572. Retry in 3 seconds.

Эти ошибки возникают при превышении лимитов Telegram Bot API:

  • Не более 30 сообщений в секунду от одного бота глобально
  • Не более 1 сообщения в секунду в один чат
  • Дополнительные ограничения для разных типов сообщений

Решение

Реализована комплексная система rate limiting, включающая:

1. Основные компоненты

rate_limiter.py

  • ChatRateLimiter: Ограничивает скорость отправки сообщений для конкретного чата
  • GlobalRateLimiter: Глобальные ограничения для всех чатов
  • RetryHandler: Обработка повторных попыток с экспоненциальной задержкой
  • TelegramRateLimiter: Основной класс, объединяющий все компоненты

rate_limit_monitor.py

  • RateLimitMonitor: Мониторинг и статистика rate limiting
  • Отслеживание успешных/неудачных запросов
  • Анализ ошибок и производительности
  • Статистика по чатам

rate_limit_config.py

  • Конфигурации для разных окружений (development, production, strict)
  • Адаптивные настройки на основе уровня ошибок
  • Настройки для разных типов сообщений

rate_limit_middleware.py

  • Middleware для автоматического применения rate limiting
  • Перехват всех исходящих сообщений
  • Прозрачная интеграция с существующим кодом

2. Ключевые особенности

Rate Limiting

  • Настраиваемая скорость: 0.5 сообщений в секунду на чат (по умолчанию)
  • Burst protection: Максимум 2 сообщения подряд
  • Глобальные ограничения: 10 сообщений в секунду глобально
  • Адаптивные задержки: Увеличение задержек при ошибках

Retry Mechanism

  • Экспоненциальная задержка: Увеличение времени ожидания при повторных попытках
  • Максимальные ограничения: Ограничение максимального времени ожидания
  • Умная обработка ошибок: Разные стратегии для разных типов ошибок

Мониторинг

  • Детальная статистика: Отслеживание всех запросов и ошибок
  • Анализ производительности: Процент успеха, время ожидания, активность
  • Административные команды: /ratelimit_stats, /ratelimit_errors, /reset_ratelimit_stats

3. Интеграция

Обновленные функции

# helper_func.py
async def send_voice_message(chat_id, message, voice, markup=None):
    from .rate_limiter import send_with_rate_limit
    
    async def _send_voice():
        if markup is None:
            return await message.bot.send_voice(chat_id=chat_id, voice=voice)
        else:
            return await message.bot.send_voice(chat_id=chat_id, voice=voice, reply_markup=markup)
    
    return await send_with_rate_limit(_send_voice, chat_id)

Middleware

# voice_handler.py
from helper_bot.middlewares.rate_limit_middleware import MessageSendMiddleware

def _setup_middleware(self):
    self.router.message.middleware(DependenciesMiddleware())
    self.router.message.middleware(BlacklistMiddleware())
    self.router.message.middleware(MessageSendMiddleware())  # Новый middleware

4. Конфигурация

Production настройки (по умолчанию)

PRODUCTION_CONFIG = RateLimitSettings(
    messages_per_second=0.5,  # 1 сообщение каждые 2 секунды
    burst_limit=2,            # Максимум 2 сообщения подряд
    retry_after_multiplier=1.5,
    max_retry_delay=30.0,
    max_retries=3,
    voice_message_delay=2.5,  # Дополнительная задержка для голосовых
    media_message_delay=2.0,
    text_message_delay=1.5
)

Адаптивная конфигурация

Система автоматически ужесточает ограничения при высоком уровне ошибок:

  • При >10% ошибок: уменьшение скорости в 2 раза
  • При <1% ошибок: увеличение скорости на 20%

5. Мониторинг и администрирование

Команды для администраторов

  • /ratelimit_stats - Показать статистику rate limiting
  • /ratelimit_errors - Показать недавние ошибки
  • /reset_ratelimit_stats - Сбросить статистику

Пример вывода статистики

📊 Статистика Rate Limiting

🔢 Общая статистика:
• Всего запросов: 1250
• Процент успеха: 98.4%
• Процент ошибок: 1.6%
• Запросов в минуту: 12.5
• Среднее время ожидания: 1.2с
• Активных чатов: 45
• Ошибок за час: 3

🔍 Детальная статистика:
• Успешных запросов: 1230
• Неудачных запросов: 20
• RetryAfter ошибок: 15
• Других ошибок: 5

6. Тестирование

Создан полный набор тестов в test_rate_limiter.py:

  • Тесты всех компонентов
  • Интеграционные тесты
  • Тесты конфигурации
  • Тесты мониторинга

Запуск тестов:

pytest tests/test_rate_limiter.py -v

7. Преимущества решения

  1. Предотвращение ошибок: Автоматическое соблюдение лимитов API
  2. Прозрачность: Минимальные изменения в существующем коде
  3. Мониторинг: Полная видимость производительности
  4. Адаптивность: Автоматическая настройка под нагрузку
  5. Надежность: Умная обработка ошибок и повторных попыток
  6. Масштабируемость: Поддержка множества чатов

8. Рекомендации по использованию

  1. Мониторинг: Регулярно проверяйте статистику через /ratelimit_stats
  2. Настройка: При необходимости корректируйте конфигурацию под ваши нужды
  3. Алерты: Настройте уведомления при высоком проценте ошибок
  4. Тестирование: Проверяйте работу в тестовой среде перед продакшеном

9. Будущие улучшения

  • Интеграция с системой метрик (Prometheus/Grafana)
  • Автоматическое масштабирование ограничений
  • A/B тестирование разных конфигураций
  • Интеграция с системой алертов