Пояснительная записка
Каждый разбор относится к одному узлу сборки и объясняет, что в нём ломается, почему и что с этим делать.
15 разборов · 6 узлов
Ядро
Место, где живёт логика вашего продукта и принимаются решения. Всё остальное обслуживает его.
-
Где на самом деле живёт бизнес-логика
Одно и то же правило оказывается реализовано в базе, в сервисе и на клиенте — с тремя разными поведениями. Разбор того, кто и что должен вынуждать.
-
Четыре языка — это выбор, а не коллекция
Чем PHP, Java, Python и C++ действительно отличаются для одной серверной задачи, и почему цена второго языка в проекте измеряется не синтаксисом.
-
Ошибка — часть контракта, а не случайность
Почему «бросим исключение, наверху разберутся» — это решение не проектировать контракт, и чем ожидаемый отказ отличается от дефекта.
Хранилище
Где лежат данные и как достать нужное быстро, когда их станет в сто раз больше.
-
Индекс есть, а планировщик его не берёт
Почему «добавьте индекс» — не ответ, и как читать решение планировщика, который считает полный проход дешевле поиска по дереву.
-
Миграции без простоя: почему «просто добавить колонку» врёт
Схема и код меняются в разные моменты, и между ними всегда есть окно, где работают обе версии. Разбор того, что из этого следует.
-
ORM: что вы отдаёте за удобство
ORM берёт плату не производительностью. Она прячет границу между памятью процесса и состоянием базы — и поэтому N+1 переживает любое код-ревью.
Обмен
Как система разговаривает с другими: с приложением, с партнёрами, с платежами, с почтой.
-
Exactly-once не существует
Доставку ровно один раз продают как свойство очереди. Разбор того, почему это свойство получателя, и что делать вместо надежды на брокера.
-
Ретрай, который устраивает DDoS вам же
Повтор без джиттера и без бюджета превращает частичный отказ в полный. Разбор механики лавины и трёх вещей, которые её останавливают.
-
Таймаут по умолчанию — это отсутствие таймаута
Незаданный таймаут не «разумный», а чаще всего бесконечный. Разбор того, как один медленный сосед выедает пул соединений и утаскивает за собой сервис.
Сборка и выкат
Чтобы обновление выходило по кнопке и откатывалось за минуту, а не роняло работу на вечер.
-
Kubernetes раньше, чем он нужен
Оркестратор решает задачу, которой у вас может не быть, и создаёт задачу, которая появится обязательно. Разбор того, что именно он покупает и чем за это платят.
-
Секрет в переменной окружения — это не секрет
Переменные окружения видны в дампе, в отчёте о падении, в списке процессов и в панели оркестратора. Разбор того, где они утекают и что ставить вместо.
Наблюдаемость
Чтобы об отказе вы узнавали от системы, а не от клиента, который до вас дозвонился.
-
Алерт, на который никто не идёт
Правило, которое срабатывает и не требует действия, — это лог с уведомлением. Разбор того, почему такие правила вреднее отсутствия мониторинга.
-
Логи, метрики, трассировка: что из трёх вам действительно нужно
Три столпа продают набором. Они отвечают на разные вопросы, стоят по-разному, и начинать надо не с того, что модно.
Каркас
Чтобы через год код можно было менять, а не переписывать с нуля вместе с командой.
-
Границы модулей дороже, чем стиль кода
Линтер спорит о кавычках, а проект тонет в том, что модули знают друг о друге слишком много. Разбор того, как границу описать и как заставить её держаться.
-
Микросервисы — ответ на организационную проблему
Распил решает вопрос независимости команд и выкатов, а не производительности. Разбор того, что покупается и чем платят, если команда одна.