Архитектурный разбор: пустота — это не государство
Исходный дизайн системы выглядел функциональным на бумаге, но содержал несколько критических скрытых сбоев. Одна ошибка заключалась в несуществующем методе PollStats.snapshot(), что приводило к полному отказу наблюдаемости. Другая проблема заключалась в TypeError при вызове PollResult.down() с аргументом detail, что приводило к бесшумному сбою обработчиков ошибок. Логика повторных попыток для ограничения скорости и тайм-аутов фактически была "мертвым кодом", что приводило к непрерывному сжиганию процессора под нагрузкой.Пробел в логике означал, что десять последовательных тайм-аутов не вызывали тревогу, ложно сообщая о работоспособности движка. Кроме того, отсутствующий импорт для Generic был NameError, который мог возникнуть в аннотациях типов. Улучшенная реализация устраняет эти проблемы, определяя явные сигнатуры методов и типы возвращаемых значений для предотвращения TypeError и NameError. Она реализует надлежащий метод снимка с использованием __slots__ для предсказуемого использования памяти.Логика повторных попыток теперь корректно срабатывает при исходах TIMEOUT и RATE_LIMITED, принудительно устанавливая задержки. Порог "зависания" теперь проверяет как пустые счетчики, так и счетчики сбоев, обеспечивая соответствующее срабатывание тревог. Управление ресурсами было улучшено с помощью deque(maxlen=500) для ограничения истории и одного цикла актора для устранения накладных расходов на каждую задачу. Очистка асинхронных задач была исправлена с помощью asyncio.wait_for для предотвращения зависания при завершении работы. Параллельное изменение состояния предотвращается использованием одной задачи asyncio.Task, что устраняет необходимость в блокировках. Сценарий наводнения запросами 429 драматически демонстрирует улучшенную отказоустойчивость, предотвращая бесконечное опробование и чрезмерное потребление ресурсов. Суть в том, что неполнота в дизайне системы эквивалентна поломке, просто с отложенным сбоем.
PollStats.snapshot(), что приводило к полному отказу наблюдаемости. Другая проблема заключалась вTypeErrorпри вызовеPollResult.down()с аргументомdetail, что приводило к бесшумному сбою обработчиков ошибок. Логика повторных попыток для ограничения скорости и тайм-аутов фактически была "мертвым кодом", что приводило к непрерывному сжиганию процессора под нагрузкой.Пробел в логике означал, что десять последовательных тайм-аутов не вызывали тревогу, ложно сообщая о работоспособности движка. Кроме того, отсутствующий импорт дляGenericбылNameError, который мог возникнуть в аннотациях типов. Улучшенная реализация устраняет эти проблемы, определяя явные сигнатуры методов и типы возвращаемых значений для предотвращенияTypeErrorиNameError. Она реализует надлежащий метод снимка с использованием__slots__для предсказуемого использования памяти.Логика повторных попыток теперь корректно срабатывает при исходахTIMEOUTиRATE_LIMITED, принудительно устанавливая задержки. Порог "зависания" теперь проверяет как пустые счетчики, так и счетчики сбоев, обеспечивая соответствующее срабатывание тревог. Управление ресурсами было улучшено с помощьюdeque(maxlen=500)для ограничения истории и одного цикла актора для устранения накладных расходов на каждую задачу. Очистка асинхронных задач была исправлена с помощьюasyncio.wait_forдля предотвращения зависания при завершении работы. Параллельное изменение состояния предотвращается использованием одной задачиasyncio.Task, что устраняет необходимость в блокировках. Сценарий наводнения запросами 429 драматически демонстрирует улучшенную отказоустойчивость, предотвращая бесконечное опробование и чрезмерное потребление ресурсов. Суть в том, что неполнота в дизайне системы эквивалентна поломке, просто с отложенным сбоем.