- 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.
8.0 KiB
8.0 KiB
Решение проблемы 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. Преимущества решения
- Предотвращение ошибок: Автоматическое соблюдение лимитов API
- Прозрачность: Минимальные изменения в существующем коде
- Мониторинг: Полная видимость производительности
- Адаптивность: Автоматическая настройка под нагрузку
- Надежность: Умная обработка ошибок и повторных попыток
- Масштабируемость: Поддержка множества чатов
8. Рекомендации по использованию
- Мониторинг: Регулярно проверяйте статистику через
/ratelimit_stats - Настройка: При необходимости корректируйте конфигурацию под ваши нужды
- Алерты: Настройте уведомления при высоком проценте ошибок
- Тестирование: Проверяйте работу в тестовой среде перед продакшеном
9. Будущие улучшения
- Интеграция с системой метрик (Prometheus/Grafana)
- Автоматическое масштабирование ограничений
- A/B тестирование разных конфигураций
- Интеграция с системой алертов