2022 03 20 настройки таймаутов
Какие таймауты ставить по умолчанию?
Началось всё с вопроса - почему авторы библиотек не ставят таймаут по-умолчанию?
В очередной раз столкнулся с тем, что авторы решают оставить запросы по-умолчанию без таймаута: https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-EMAIL_TIMEOUT.
Это распространённое поведение приводит к тому, что в случае замедления внешнего сервиса каскадно замедляется и внутренний. Причём в случае с низкопроизводительными языками это может привести к полному отказы работы сервиса, так как не будут доступны процессы к обслуживанию запросов.
Единственную мотивацию по этому вопросу читал от Kenneth Reitz. Ссылка утеряна в интернетах, но сообщение было в следующем: Привет. Я не знаю в какой среде будет использоваться моя библиотека requests, поэтому и не могу указать дефолтный timeout. В случаях, когда пользователь будет загружать файл через мою библиотеку - он будет получать ошибку и это приведёт к росту issues в github проекта.
И такая проблема не только в экосистеме python, аналогичные статьи можно найти и про net/http в golang. Хотя не во всех языках так, в ruby стоит ограничение на 60 секунд.
Интереснее, что происходит с этим дальше. Добавить таймауты на все запросы (в случае requests) становится сложным из-за того, что библиотека в лучшем случае размазана по набору внутренних wrapper’ов/клиентов, в худшем напрямую используется внутри лапши, в адовом - лежит во внешних библиотеках. В этот момент у инженеров окончательно падают руки и решение перекладывается на инфраструктуру в виде добавления sidecar (envoy, etc).
Итого, нет ответа на этот вопрос. Пока придерживаюсь вывода, что есть условно три среды:
- внутренние сервисы в одной сети - должно быть быстрее N*latency сети, где N < 10.
- внешние сервисы зависимости - должно быть быстрее 30 секунд, елси позволяет их SLA.
- точно медленные среды - 2g мобилки, IoT устройства, загрузка больших файлов. С учётом того, что там должен храниться стейт, делаться повторы запросов, разбиваться на чанки запрос может идти до 2 минут.
P.s. надо было настроить таймауты в fastapi-mail, так оказалось что ребята решили вообще настроек не давать https://github.com/sabuhish/fastapi-mail/blob/master/fastapi_mail/config.py#L8. Я так понимаю в aio* принято полагаться на event loop с async-timeout? (:
Что-то ещё по теме
- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
- https://brooker.co.za/blog/2022/02/16/circuit-breakers.html
#вопрос_среды