
- Главная
- Каталог
- Интернет технологии
- Backend Ready | IT
Backend Ready | IT
Авторский канал по Backend разработке. Новости, ресурсы, гайды и шпаргалки.
Статистика канала
/health), который сообщает о состоянии приложения.
Два уровня проверки: 🛠️
— Liveness (Жив ли процесс?): Простая проверка, что приложение вообще запущено и отвечает. Если этот эндпоинт падает, оркестратор (например, Kubernetes) просто перезапускает контейнер.
— Readiness (Готов ли к работе?): Более глубокая проверка. Сервис может быть запущен, но база данных еще не подключилась или кэш не прогрелся. Если Readiness-проверка не проходит, на сервис просто не направляется живой трафик, но его не перезапускают. ⏳
**Что нужно проверять внутри /health? 📝
— Соединение с БД:** Можем ли мы выполнить простой SELECT 1?
— Доступность брокеров сообщений: Жив ли RabbitMQ или Kafka?
— Место на диске и память: Не закончились ли ресурсы? 📈
— Внешние зависимости: Если твой сервис не может работать без стороннего API, это тоже стоит учитывать.
Зачем это нужно? 🚀
— Self-healing (Самолечение): Система сама находит «больные» инстансы и восстанавливает их без участия админа.
— Zero Downtime Deployment: При обновлении новая версия сервиса не получит трафик, пока Readiness-проверка не подтвердит, что всё готово. 🛡️
— Мониторинг: Эти же данные собирает Prometheus или Zabbix, чтобы нарисовать красивые графики аптайма.
> Важный нюанс: Не делай проверку здоровья слишком «тяжелой». Если на каждый запрос /health ты будешь делать 10 запросов к разным базам, ты сам создашь лишнюю нагрузку. Используй кэширование результата проверки на пару секунд. ✅
500 при первой неудаче — ты теряешь пользователей на пустом месте.
Решение — Паттерн Retry (Повтор) 🛠️
Идея проста: если запрос не удался, не сдавайся сразу. Попробуй еще раз через мгновение.
Стратегии повторов:
— Immediate Retry: Пробуем снова сразу. Подходит для очень редких и случайных сбоев сети.
— Fixed Delay: Ждем ровно 1 секунду перед каждой новой попыткой. ⏳
— Exponential Backoff: С каждой неудачей увеличиваем время ожидания (1с, 2с, 4с, 8с...). Это критично, чтобы не «добивать» сервис, который и так перегружен и не успевает отвечать. 📈
— Jitter (Джиттер): Добавление случайного шума в задержку (например, не ровно 2с, а 2.13с). Это нужно, чтобы сотни упавших инстансов не набросились на сервер одновременно в одну и ту же секунду после паузы («эффект стада»). 🐎
Золотые правила безопасного Retry: 🛡️
— Только для идемпотентных операций: Повторять GET или PUT — безопасно. Повторять POST (создание заказа или оплату) без специального ключа идемпотентности — опасно, можно создать два заказа вместо одного. 💳
— Лимит попыток: Никогда не делай бесконечный цикл повторов. Обычно 3–5 попыток достаточно. Если не помогло — значит, проблема серьезная, и пора звать дежурного инженера.
— Разделяй ошибки: Повторяй запрос только при сетевых ошибках или 503 Service Unavailable. Если сервер ответил 400 Bad Request или 401 Unauthorized — повтор не поможет, нужно исправлять код или токены. ❌
> Итог: Retry делает систему «живучей». Это простой способ превратить 99.0% доступности в 99.99%, просто проявив немного терпения к сетевым лагам. 🚀
INSERT, UPDATE, DELETE).
— Replica (Slave): Копия главного сервера. Она постоянно подтягивает изменения из логов мастера и применяет их у себя.
Зачем это нужно? 🚀
— Отказоустойчивость (High Availability): Если Master «упал», одна из реплик может быстро стать новым мастером. Система продолжит работу. 🛡️
— Масштабирование чтения: Если у тебя миллион пользователей, которые просто читают посты, ты можешь распределить эти запросы между 5 репликами. Мастер при этом будет заниматься только записью.
— Безопасность бэкапов: Ты можешь делать бэкап с реплики, не нагружая и не блокируя основной сервер.
Типы репликации: ⚙️
— Синхронная: Мастер ждет, пока реплика подтвердит получение данных. Это максимально надежно (данные не потеряются), но медленно — запись ждет ответа от всех узлов.
— Асинхронная: Мастер записывает данные у себя и тут же отвечает клиенту «Ок». Реплика догонит его через несколько миллисекунд. Это очень быстро, но есть риск потерять те самые «миллисекунды» данных при резком падении мастера. ⏳
Нюанс: Replication Lag ⚠️
Иногда реплика не успевает за мастером из-за нагрузки на сеть. Пользователь может обновить профиль (запись на Master), тут же обновить страницу (чтение с Replica) и... увидеть старые данные. Это нормально для большинства систем, но об этом нужно помнить при проектировании.
> Итог: Репликация — это не бэкап, а страховка и способ ускориться. В современном продакшене база без хотя бы одной реплики — это пороховая бочка. 💣
Retry-After, чтобы клиент знал, через сколько секунд можно попробовать снова.
> Итог: Rate Limiting — это не только защита от DDoS-атак, но и способ сделать твою систему предсказуемой и справедливой для всех пользователей. Не дай одному «шумному соседу» испортить жизнь остальным! 🚀
orders. Но со временем ты замечаешь, что имя клиента дублируется 100 раз, а при изменении адреса приходится обновлять десятки строк. Тут на помощь приходит нормализация.
Это процесс организации данных, который исключает избыточность и защищает от аномалий.
Три основные формы (на пальцах): 📚
— 1НФ (Первая нормальная форма): В каждой ячейке должно быть только одно неделимое значение. Никаких списков через запятую типа tags: "java, spring, sql". Каждому тегу — своя строка.
— 2НФ (Вторая нормальная форма): Всё, что не является ключом, должно зависеть от всего ключа целиком. Если у тебя составной ключ (Заказ + Товар), то цена товара не должна зависеть от номера заказа. Выносим товары в отдельную таблицу. 📦
— 3НФ (Третья нормальная форма): Никаких транзитивных зависимостей. Если поле зависит от другого поля, которое не является ключом (например, «Город» зависит от «Почтового индекса»), выносим это в отдельный справочник.
Зачем это нужно? 🚀
— Целостность: Ты меняешь фамилию пользователя в одном месте, и она обновляется везде. Никаких «забытых» старых данных.
— Экономия места: Мы не храним длинные строки текста (например, названия категорий) миллион раз, а используем компактные числовые ID.
— Гибкость: Добавить новое поле или изменить структуру связи становится гораздо проще. 🛠️
Когда нормализация — это плохо? ⚠️
Иногда мы специально идем на денормализацию:
— Производительность: Если для сборки страницы нужно сделать 10 JOIN-ов, это может тормозить. Иногда проще оставить имя автора прямо в таблице постов, чтобы достать его одним запросом.
— Аналитика: В хранилищах данных (Data Warehouses) часто используют плоские таблицы, чтобы отчеты строились мгновенно.
> Итог: Начинай с честной 3НФ. Денормализовать базу ты всегда успеешь, когда увидишь реальные проблемы с производительностью. А вот распутывать «спагетти» из данных в одной таблице — сомнительное удовольствие. 💎
user_id), по которому система решает, на какой именно сервер отправить данные.
Зачем это нужно? 🚀
— Неограниченный рост: Ты можешь добавлять новые серверы до бесконечности.
— Скорость: Запросы выполняются параллельно на разных машинах.
— Отказоустойчивость: Если упадет один сервер, недоступна будет только часть данных (например, пользователи с ID от 1000 до 2000), а остальные 90% системы продолжат работать.
Как выбрать ключ шардирования? ⚖️
Это самый важный этап. Плохой ключ создаст «горячие точки»:
— По дате: Если шардировать по дате, то вся нагрузка сегодня будет идти на один сервер (сегодняшний), а остальные будут простаивать. ❌
— По ID (Hash-based): Берем хеш от user_id и делим на количество серверов. Нагрузка распределяется равномерно. ✅
С какими сложностями придется столкнуться? 🏗️
— Сложные JOIN-ы: Ты не можешь легко объединить таблицы, которые лежат на разных физических серверах. Приходится либо денормализовать данные, либо делать объединение на уровне кода приложения.
— Транзакции: Распределенные транзакции (между двумя шардами) — это очень сложно и медленно.
— Решардинг: Если тебе нужно добавить еще 5 серверов и перераспределить данные, это превращается в серьезную инженерную операцию. 🛠️
> Итог: Шардирование — это «тяжелая артиллерия». Не используй его, пока обычная репликация или оптимизация индексов справляются с нагрузкой. Но если ты строишь систему на сотни миллионов пользователей — без него не обойтись.
ALTER TABLE users DROP COLUMN phone? Но если у тебя распределенная система и несколько запущенных инстансов приложения, обычное удаление колонки гарантированно уронит часть запросов.
В чем подвох? 📉
Когда ты катишь миграцию, база обновляется мгновенно. Но старый код, который еще работает на серверах, всё еще ожидает найти колонку phone в своих SELECT * или маппингах моделей. Результат — ошибки 500 и паника в логах.
Решение: Паттерн Expand and Contract (Расширение и Сужение) 🔄
Процесс разбивается на три безопасных этапа (три разных релиза):
Этап 1: Подготовка (Expand)
— Мы перестаем использовать колонку в коде, но в базе она остается.
— Если мы добавляем новую колонку вместо старой — создаем её и начинаем писать данные в обе колонки сразу.
— База «расширяется». Старый код всё еще видит старую колонку и счастлив.
Этап 2: Переключение
— Обновляем код так, чтобы он читал только из новой колонки (или просто игнорировал ту, что мы хотим удалить).
— Проверяем логи. Если ошибок нет и старая колонка больше никому не нужна — мы готовы к финалу.
Этап 3: Очистка (Contract)
— Только теперь, когда мы на 100% уверены, что ни один запущенный инстанс приложения не обращается к полю, мы выполняем DROP COLUMN.
— База «сужается» до нового состояния.
Почему это круто? 🚀
— Zero Downtime: Пользователи даже не заметят, что структура данных изменилась.
— Безопасный откат: Если на этапе 2 что-то пошло не так, ты можешь просто откатить код. Данные в базе всё еще на месте и актуальны.
— Спокойствие: Тебе не нужно останавливать весь мир, чтобы поменять одну строчку в схеме.
> Итог: Удаление данных — это всегда опаснее, чем их добавление. Паттерн Expand and Contract превращает рискованную операцию в скучную и предсказуемую рутину. 💎
console.log, когда что-то сломалось, починили и пошли дальше. В итоге получаются в основном шумные логи, которые вообще ничего не говорят, когда прод полыхает.
1. Начинай со структурированного логирования: вместо обычного текста пиши JSON с едиными, предсказуемыми полями, по которым можно нормально искать.
Тогда твой мониторинг сможет алертить, фильтровать и строить графики, а логи можно будет “запрашивать” почти как базу данных.
2. Используй уровни логов по делу.
• INFO = ожидаемые бизнес-события (например, пользователь залогинился)
• WARN = обработанные аномалии (например, ретраим упавший вызов)
• ERROR = реальные фейлы, которые требуют внимания
• DEBUG = детали для разработки, в проде выключать
Большинство команд ставят ERROR вообще на все. Не надо так.
3. Всегда держи “чеклист контекста”:
Само сообщение лога почти бесполезно. Ценность дают контекстные поля, которые к нему приклеены, и именно они делают лог пригодным для действий.
• Идентификаторы: user_id, order_id, request_id
• Значения: amount, count, size
• Состояние: status, current_step
• Детали ошибки: error_code, exception
• Время: duration_ms
Идентификаторы отвечают на “кто и что”, значения на “сколько”, состояние на “где мы в процессе”, детали ошибки на “что пошло не так”, а время на “как долго это длилось”.
4. Используй correlation ID:
Генерируй уникальный request_id на каждом входе в систему. Протаскивай его через каждую функцию, сервис и лог.
Без этого дебажить параллельные запросы становится проблемнее.
5. Никогда не логируй чувствительные данные:
Не логируй пароли, токены, номера карт, сырой SQL с пользовательскими значениями, данные, возвращаемые запросами, и т.п.
Цель такая: любой инженер во время инцидента должен открыть логи и сразу понять, что произошло, даже не лазя в исходники.
Отзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Backend Ready | IT — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 7.4K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 7.0, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 839.16 ₽, а за 12 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий