Закон протекающих абстракций и почему он портит вам tail latency
Закон протекающих абстракций говорит о том, что любая удобная обёртка рано или поздно перестаёт скрывать свою сложность.
Tail latency — это когда запрос, обычно делающийся за 200 ms, внезапно занимает 2 s. Такое поведение ухудшает пользовательский опыт - пользователь может не дождаться и уйти. В распределённой системе эффект еще и усиливается: один затупивший вызов тянет за собой всю цепочку
Почему появляются такие задержки? Сеть потеряла пакет, TCP ушёл в backoff, DNS задумался, GC начал собирать мусор не вовремя, прокси сделал лишний ретрай. В обычном коде всё выглядит гладко, но под нагрузкой эти мелочи превращаются в p95/p99 latency
Как бороться с tail latency? Есть ряд паттернов:
- хеджированные запросы - отправляем запрос на несколько нод сразу, и берем ответ от первого
- request coalescing - одинаковый запросы "склеиваем" в один, чтоб не грузить нижние слои системы
- deadline propagation - каждый участок запроса знает сколько у него осталось времени на выполнение
- circuit breakers - если модуль стал отдавать много ошибок, можно отрезать часть запросов от него, чтоб дать ему восстановиться
- latency-aware load balancing - раскидывать нагрузку не round-robin'ом, а в зависимости от состояния нод
Каждый паттерн — отдельная история, но вместе они сильно уменьшают хвосты.
🚀 Пост Guru PHP: @msavin_dev
Закон протекающих абстракций говорит о том, что любая удобная обёртка рано или поздно перестаёт скрывать свою сложность.
Tail latency — это когда запрос, обычно делающийся за 200 ms, внезапно занимает 2 s. Такое поведение ухудшает пользовательский опыт - пользователь может не дождаться и уйти. В распределённой системе эффект еще и усиливается: один затупивший вызов тянет за собой всю цепочку
Почему появляются такие задержки? Сеть потеряла пакет, TCP ушёл в backoff, DNS задумался, GC начал собирать мусор не вовремя, прокси сделал лишний ретрай. В обычном коде всё выглядит гладко, но под нагрузкой эти мелочи превращаются в p95/p99 latency
Как бороться с tail latency? Есть ряд паттернов:
- хеджированные запросы - отправляем запрос на несколько нод сразу, и берем ответ от первого
- request coalescing - одинаковый запросы "склеиваем" в один, чтоб не грузить нижние слои системы
- deadline propagation - каждый участок запроса знает сколько у него осталось времени на выполнение
- circuit breakers - если модуль стал отдавать много ошибок, можно отрезать часть запросов от него, чтоб дать ему восстановиться
- latency-aware load balancing - раскидывать нагрузку не round-robin'ом, а в зависимости от состояния нод
Каждый паттерн — отдельная история, но вместе они сильно уменьшают хвосты.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Mikhail Savin
Ментор PHP backend GitHub: https://github.com/savinmikhail
#Собес #microservices #monolithic #architecture
🤔 Middle+ PHP Backend-разработчик в компанию Астро волга
Техническое собеседование PHP-разработчика. ЗП от 165к с фокусом на архитектуру веб-приложений, работу с базами данных и брокерами сообщений
💬 Вопросы:
- Как бы вы описали паттерн проектирования Singleton?
- Что такое трейты в PHP?
- Что такое Dockerfile?
- Объясните, что такое обмен (Exchange)?
- Что такое микросервисная архитектура?
👉 Все вопросы из этого собеседования (31)
📣 Хочешь больше собесов?
Подпишись на наш главный канал
🤔 Middle+ PHP Backend-разработчик в компанию Астро волга
Техническое собеседование PHP-разработчика. ЗП от 165к с фокусом на архитектуру веб-приложений, работу с базами данных и брокерами сообщений
💬 Вопросы:
- Как бы вы описали паттерн проектирования Singleton?
- Что такое трейты в PHP?
- Что такое Dockerfile?
- Объясните, что такое обмен (Exchange)?
- Что такое микросервисная архитектура?
👉 Все вопросы из этого собеседования (31)
📣 Хочешь больше собесов?
Подпишись на наш главный канал
#Собес #git_хуки
🤔 Из чего состоят “хуки” в Git?
💬 Кратко:
Хуки в Git — это скрипты, которые выполняются автоматически при определённых действиях в репозитории, таких как коммиты, слияния или пуши. Они находятся в директории
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🤔 Из чего состоят “хуки” в Git?
💬 Кратко:
Хуки в Git — это скрипты, которые выполняются автоматически при определённых действиях в репозитории, таких как коммиты, слияния или пуши. Они находятся в директории
.git/hooks и могут быть настроены для выполнения различных задач.📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#repository #кибербезопасность
📚 Структурированный 90-дневный план обучения кибербезопасности предназначенный для начинающих специалистов
План обучения, разделённый на ежедневные задания, охватывающие ключевые темы
Перейти к материалу
👉 База вопросов 👉 Новости
📚 Структурированный 90-дневный план обучения кибербезопасности предназначенный для начинающих специалистов
План обучения, разделённый на ежедневные задания, охватывающие ключевые темы
Перейти к материалу
👉 База вопросов 👉 Новости
#Собес #query_builder #request #laravel
🤔 Что такое Query Builder в Laravel?
💬 Кратко:
Query Builder в Laravel — это инструмент, который позволяет строить запросы к базе данных с использованием PHP-кода, избегая необходимости писать SQL-запросы вручную. Он предоставляет удобные методы для создания, выполнения и кэширования запросов.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🤔 Что такое Query Builder в Laravel?
💬 Кратко:
Query Builder в Laravel — это инструмент, который позволяет строить запросы к базе данных с использованием PHP-кода, избегая необходимости писать SQL-запросы вручную. Он предоставляет удобные методы для создания, выполнения и кэширования запросов.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🔥1
Blue-Green Deployment
Blue-green — это способ выкатывать новую версию без простоя и практически с мгновенным откатом на старую версию если что-то пошло не так
У вас есть два окружения — blue (текущий прод) и green (новая версия).
Вы обновляете green, прогоняете smoke-тесты, а потом просто переключаете трафик на него.
Переключение обычно занимает миллисекунды — достаточно указать load balancer’у новый бэкенд.
При этом мы имеем такую же простую возможность отката, если что-то все таки пошло не так - переключаем трафик на blue и спокойно правим green
Но есть важный нюанс - база данных и любые другие контракты данных должны быть совместимы между соседними версиями.
Обе версии (blue и green) должны уметь работать с одной и той же схемой БД одновременно. То же самое касается схемы кеша, форматов сообщений, протоколов очередей — разве что здесь можно выкрутиться версионированием ключей.
Blue-green не решает все проблемы, но снимает главный страх релизов:
“если что-то поломается, мы вернём всё назад за секунду”.
🚀 Пост Guru PHP: @msavin_dev
Blue-green — это способ выкатывать новую версию без простоя и практически с мгновенным откатом на старую версию если что-то пошло не так
У вас есть два окружения — blue (текущий прод) и green (новая версия).
Вы обновляете green, прогоняете smoke-тесты, а потом просто переключаете трафик на него.
Переключение обычно занимает миллисекунды — достаточно указать load balancer’у новый бэкенд.
При этом мы имеем такую же простую возможность отката, если что-то все таки пошло не так - переключаем трафик на blue и спокойно правим green
Но есть важный нюанс - база данных и любые другие контракты данных должны быть совместимы между соседними версиями.
Обе версии (blue и green) должны уметь работать с одной и той же схемой БД одновременно. То же самое касается схемы кеша, форматов сообщений, протоколов очередей — разве что здесь можно выкрутиться версионированием ключей.
Blue-green не решает все проблемы, но снимает главный страх релизов:
“если что-то поломается, мы вернём всё назад за секунду”.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Mikhail Savin
Ментор PHP backend GitHub: https://github.com/savinmikhail
#Собес #design #patterns #strategy
🤔 Какие паттерны проектирования знаете? Где применяли?
💬 Кратко:
Паттерны проектирования - это проверенные решения распространенных проблем в разработке. Адаптер используется для совместимости разных интерфейсов, Фабрика создает объекты без указания точного класса, Стратегия позволяет менять алгоритмы поведения, Observer реализует систему событий. Эти паттерны помогают создавать гибкий, поддерживаемый и масштабируемый код в реальных проектах.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🤔 Какие паттерны проектирования знаете? Где применяли?
💬 Кратко:
Паттерны проектирования - это проверенные решения распространенных проблем в разработке. Адаптер используется для совместимости разных интерфейсов, Фабрика создает объекты без указания точного класса, Стратегия позволяет менять алгоритмы поведения, Observer реализует систему событий. Эти паттерны помогают создавать гибкий, поддерживаемый и масштабируемый код в реальных проектах.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #inheritance #table #data_hierarchy
🤔 Что такое таблицы с наследованием в PostgreSQL и зачем они нужны?
💬 Кратко:
В PostgreSQL таблицы могут наследовать структуру и данные другой таблицы, что полезно для разделения данных или создания иерархий. Например, можно создать таблицы для разных типов пользователей, которые наследуют общие поля из родительской таблицы.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🤔 Что такое таблицы с наследованием в PostgreSQL и зачем они нужны?
💬 Кратко:
В PostgreSQL таблицы могут наследовать структуру и данные другой таблицы, что полезно для разделения данных или создания иерархий. Например, можно создать таблицы для разных типов пользователей, которые наследуют общие поля из родительской таблицы.
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#course #ии-помощник
📚 Курс PHP
Изучите язык программирования PHP в интерактивной онлайн среде. Десятки заданий прямо в браузере с поддержкой ИИ-ассистента
Перейти к материалу
👉 База вопросов 👉 Новости
📚 Курс PHP
Изучите язык программирования PHP в интерактивной онлайн среде. Десятки заданий прямо в браузере с поддержкой ИИ-ассистента
Перейти к материалу
👉 База вопросов 👉 Новости
#Собес #upload #file #form
🤔 Как PHP обрабатывает загрузку файлов?
💬 Кратко:
PHP обрабатывает загрузку файлов через суперглобальный массив
📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🤔 Как PHP обрабатывает загрузку файлов?
💬 Кратко:
PHP обрабатывает загрузку файлов через суперглобальный массив
$_FILES. Файл отправляется через форму с атрибутом enctype="multipart/form-data", и PHP сохраняет информацию о загружаемом файле в $_FILES, включая имя файла, тип и путь.📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору
📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Scale Cube: 3 способа масштабироваться
Когда система перестаёт держать нагрузку, приходит время масштабироваться
Обычно делают так:
- добавили инстансы → стало не лучше
- распилили на микросервисы → стало хуже
Scale Cube модель предлагает 3 оси. Каждая закрывает свой bottleneck:
X - клонирование
Больше одинаковых копий сервиса за балансером.
Помогает, когда упираетесь в CPU/IO на приложении.
Y - разделение ответственности
Делите по функциям: поиск, отчёты, платежи.
Нужно, когда одна часть системы “убивает” остальных и её надо изолировать/масштабировать отдельно.
Z - разделение по данным (sharding/partitioning)
Делите данные по ключу (
Применяется когда потолок - данные: одна БД/таблица, hot keys, локи. Запись и чтение можно масштабировать отдельно
Например, если узкое место - база, то:
- X почти не поможет (вы просто сильнее нагрузите БД)
- микросервисы чаще ухудшат (больше запросов + распределённые транзакции/консистентность)
- а вот Z может дать рост capacity
Выбирать ось надо по bottleneck’у.
Если вы не можете назвать узкое место цифрами - вы не масштабируете, а только усложняете систему.
🚀 Пост Guru PHP: @msavin_dev
Когда система перестаёт держать нагрузку, приходит время масштабироваться
Обычно делают так:
- добавили инстансы → стало не лучше
- распилили на микросервисы → стало хуже
Scale Cube модель предлагает 3 оси. Каждая закрывает свой bottleneck:
X - клонирование
Больше одинаковых копий сервиса за балансером.
Помогает, когда упираетесь в CPU/IO на приложении.
Y - разделение ответственности
Делите по функциям: поиск, отчёты, платежи.
Нужно, когда одна часть системы “убивает” остальных и её надо изолировать/масштабировать отдельно.
Z - разделение по данным (sharding/partitioning)
Делите данные по ключу (
user_id, region).Применяется когда потолок - данные: одна БД/таблица, hot keys, локи. Запись и чтение можно масштабировать отдельно
Например, если узкое место - база, то:
- X почти не поможет (вы просто сильнее нагрузите БД)
- микросервисы чаще ухудшат (больше запросов + распределённые транзакции/консистентность)
- а вот Z может дать рост capacity
Выбирать ось надо по bottleneck’у.
Если вы не можете назвать узкое место цифрами - вы не масштабируете, а только усложняете систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Mikhail Savin
Ментор PHP backend GitHub: https://github.com/savinmikhail