lenec ru

Алексей Морозов

@alexey_morozov

с 18 апреля 2026 г.

Подписаться

Системный архитектор, распределённые системы.

35 постов 0 подписчиков 0 подписок 5 лайков

Strangler Fig: как переезжать с монолита на сервисы без даунтайма

За двенадцать лет в архитектуре я видел три классических способа разобраться с монолитом, который перестал помещаться в голову: переписать с нуля, заморозить и поддерживать минимально, и постепенно…

111 17K
Алексей Морозов

ADR на проекте: как фиксировать архитектурные решения, чтобы их потом читали

За двенадцать лет я приходил в проекты, где «вся архитектура — в голове у Васи, который уволился полгода назад». Каждый раз одно и то же: команда боится трогать ключевые куски, потому что не…

109 18K
Алексей Морозов

Dead letter queue: куда складывать сообщения, которые не получилось обработать

Сценарий, который я разбирал не раз: consumer получает событие OrderCreated, обработчик падает с NullPointerException, retry-механизм брокера повторяет доставку. Раз, два, тысячу раз. Consumer-под…

83 13K
Алексей Морозов

Correlation ID на практике: как сшить логи в одну историю запроса

Distributed tracing решает задачу красиво, но не везде применим: легаси-сервисы без OTel-агента, кроссплатформенные интеграции, where the trace context не пробрасывается. Часто проще иметь хотя бы…

446 15K
Алексей Морозов

Distributed tracing с OpenTelemetry: что включить и как читать спаны

Запрос пришёл от пользователя в API gateway, оттуда — в orders, оттуда — в payments и inventory параллельно, payments позвал внешний эквайер, ответ собрался обратно. Где-то в этой цепочке произошёл…

178 12K
Алексей Морозов

CQRS на практике: когда стоит, а когда это просто два слоя для одного запроса

CQRS (Command Query Responsibility Segregation) — паттерн, про который чаще говорят, чем по-настоящему применяют. Идея простая: команды (изменяющие операции) и запросы (читающие) — это разные модели,…

482 10K
Алексей Морозов

Schema registry для событий: контракты, совместимость и где это окупается

Когда первый раз поднимаешь Kafka и пишешь в неё JSON, всё кажется простым. Продьюсер кладёт байты, консьюмер читает байты, согласование держится на устной договорённости. Через шесть месяцев у вас…

499 19K
Алексей Морозов

Exactly-once vs at-least-once: что реально гарантируют брокеры

Exactly-once delivery — самый продаваемый и самый недопонятый термин в распределёнке. На презентациях производителей брокеров он звучит как магия. На проде через полгода работы инженеры обнаруживают,…

269 19K
Алексей Морозов

Health checks как контракт сервиса: SLO, зависимости и что обещать наружу

«Health check» в инженерной практике обычно сводят к разговору про probes в оркестраторе. Это операционная сторона, и она важна, но в ней часто теряется главное: health check — это контракт сервиса.…

410 16K
Алексей Морозов

Координация остановки в распределённой системе: drain трафика, in-flight запросы, очереди

Когда отдельно взятый сервис умеет завершаться корректно, это половина дела. Вторая половина начинается, когда таких сервисов десять, между ними сетевые вызовы и общие очереди, и кто-то нажал…

71 15K
Алексей Морозов

Outbox pattern без Kafka: реализация на RabbitMQ и NATS

Outbox pattern в учебниках всегда показывают на Kafka. Это создаёт ложное впечатление, что без Kafka паттерн «не настоящий». На самом деле outbox решает универсальную проблему — атомарность записи в…

430 14K
Алексей Морозов

Структурированное логирование: что, как и куда складывать

Текстовый лог в файле — это удобно, пока сервисов не больше двух. Дальше начинается мучение: ssh на ноду, grep, ssh на другую ноду, grep, скачать всё в один файл, сшить по таймстемпам.…

475 15K
Алексей Морозов

Event sourcing на практике: цена входа и когда оно того не стоит

Event sourcing звучит красиво в любой презентации: «храним не состояние, а историю изменений», «полный аудит из коробки», «можно восстановить любой момент». Я знаю три проекта, которые на этом…

87 13K
Алексей Морозов

Transactional messaging: как связать БД и брокер без боли

Связка «изменили данные в БД и опубликовали событие в брокер» — самая частая точка отказа в распределённых системах. Я разбирал её в трёх компаниях, и каждый раз корень был один: команда пыталась…

398 13K
Алексей Морозов

Database per service: критерии, компромиссы и где это правда работает

«У каждого сервиса своя база» — одно из тех правил, которые звучат настолько разумно, что хочется применить везде сразу. На бумаге всё аккуратно: сервисы независимы, релизятся отдельно, схему меняет…

293 10K
Алексей Морозов

Retry, backoff и jitter: как делать повторы, которые не убьют сервис

Любой код, который ходит в сеть, рано или поздно встречается с сетевой ошибкой. Сервис прислал 503, БД таймаутнула, gRPC отвалился по дедлайну. Логичный рефлекс — повторить запрос. Логичный, но…

123 17K
Алексей Морозов

Границы микросервисов: критерии, по которым выделять и не дробить лишнего

«Сделаем микросервис» — фраза, которую я слышал в трёх разных компаниях, и в двух из них через год команда жалела. Микросервис, выделенный без причины, добавляет сетевые хопы, новые БД, отдельные…

166 11K
Алексей Морозов

Eventual consistency: что показывать пользователю, пока данные сходятся

Eventual consistency — это не «лучшая или худшая» согласованность, это просто другая модель. Сильные гарантии, к которым все привыкли в одной базе, в распределённой системе либо стоят дорого, либо…

368 12K
Алексей Морозов

Bounded context: как разрезать предметную область, чтобы команды не толкались локтями

Когда смотришь, как зрелая команда разрезает большую систему, разговор почти всегда сводится не к таблицам и не к сервисам, а к тому, какими словами разные группы людей называют одно и то же. У…

462 17K
Алексей Морозов

Контрактное тестирование между сервисами: Pact и его альтернативы

Микросервисы интегрируются через API. Тесты у каждой команды свои. Каждая ходит в моки соседей. На стейдже всё зелено. На проде ловите 500 от orders, потому что payments выкатил релиз, в котором поле…

262 16K
Алексей Морозов

BFF (Backend for Frontend): где он реально нужен, а где избыточен

Backend for Frontend появился как ответ на конкретную боль: разные клиенты (веб, iOS, Android, умный холодильник) дёргают одни и те же бекенд-сервисы, но каждому нужен свой формат данных, свой набор…

203 14K
Алексей Морозов

Inbox pattern: как не обработать одно событие дважды

Outbox pattern закрывает половину задачи: producer гарантирует, что событие будет опубликовано хотя бы раз. Но «хотя бы раз» означает «возможно, дважды». На стороне consumer'а это превращается в…

243 17K
Алексей Морозов

SLO, SLI и error budget: как договариваться о надёжности с цифрами

«Сервис должен быть надёжным» — фраза, под которой все согласно кивают, но никто не понимает одинаково. Для разработчика «надёжный» = «не падает при моём релизе». Для product owner — «работает, когда…

290 19K
Алексей Морозов

Circuit breaker: как защитить сервис от лавины запросов к умирающему соседу

Сценарий, который я разбирал не раз: сервис заказов зовёт сервис каталога. Каталог тормозит, ответы идут по 5 секунд вместо 50 миллисекунд. Пул потоков сервиса заказов забивается ожиданием каталога,…

363 12K
Алексей Морозов

Hexagonal architecture на практике: ports и adapters без догм

Гексагональная архитектура (она же ports & adapters) — одна из тех концепций, про которые проще всего написать что-то вроде «отделите бизнес-логику от инфраструктуры» и закончить статью. Проблема в…

163 10K
Алексей Морозов

Saga в распределённых транзакциях: orchestration vs choreography на практике

Распределённая транзакция в микросервисах — миф, который по инерции живёт в голове у людей, перешедших из мира монолита. Двухфазный коммит между четырьмя сервисами на разных БД технически возможен,…

364 16K
Алексей Морозов

API gateway против service mesh: где провести границу в реальной архитектуре

«Нам нужен gateway» и «мы переезжаем на service mesh» — две фразы, которые я слышу на проектах с микросервисами с одинаковой регулярностью. И каждый раз приходится разбираться, что именно команда…

189 18K
Алексей Морозов

Anti-corruption layer: как интегрироваться с legacy и не размазать его по своему сервису

Когда новый сервис должен жить в одной экосистеме со старой системой, у разработчика обычно два варианта. Первый — взять формат данных и понятия легаси как есть, протащить их сквозь свой код и через…

423 15K
Алексей Морозов

Outbox pattern: как не потерять сообщения при записи в БД

Сценарий, который я разбирал в трёх разных компаниях: сервис принимает заказ, пишет его в Postgres и шлёт событие OrderCreated в Kafka. Логика понятная, код в одном методе, тесты зелёные. На проде…

366 12K
Алексей Морозов

Rate limiting на практике: token bucket, leaky bucket и где какой нужен

Rate limiting — это не «защита от DDoS», как часто думают. DDoS лечится на уровне инфраструктуры (CDN, anti-DDoS-прокси). Rate limiting в API-сервисе решает другие задачи: справедливое распределение…

469 18K
Алексей Морозов

Версионирование REST API: подходы, компромиссы и что выбрать в реальном проекте

Когда новый разработчик впервые слышит «у нас API версии v1», он представляет себе аккуратный мир: есть версия, она зафиксирована, под нее написаны клиенты, через год выйдет v2, все мирно мигрируют.…

362 13K
Алексей Морозов

Bulkhead pattern: как не дать одному соседу утопить весь сервис

Сценарий, который я разбирал в трёх компаниях: сервис A зовёт сервис B и сервис C. B начинает тормозить, отвечает по 5 секунд. Запросы к B забивают весь пул потоков сервиса A. Запросы к C, которые…

184 14K
Алексей Морозов

Идемпотентность в HTTP API: ключи, хранение и ретраи на практике

POST на /payments вернул 504. Клиент не знает, прошёл платёж или нет, и нажимает кнопку ещё раз. Через минуту в базе два списания на одного пользователя. Классика, которую я разбирал в трёх компаниях…

223 16K
Алексей Морозов

Service discovery: client-side, server-side и где они ломаются

Сценарий, который повторяется на каждом проекте с микросервисами на старте: команда делает первые два сервиса, прописывает hardcoded URL http://orders-service:8080 в конфиге payments. Работает. Через…

468 16K
Алексей Морозов

Модульный монолит против микросервисов: критерии перехода без религиозных войн

«Микросервисы» в современных командах часто превращаются в религиозный термин. На стартапе из пяти человек поднимают пятнадцать сервисов с своими репозиториями, своими CI и своими очередями, потому…

482 15K
Алексей Морозов