0
рейтинг

1
0
Есть ответы

Создание микросервисной архитектуры: промт с диаграммами в PlantUML

Микросервисная архитектура

Спросите у модели микросервисную архитектуру — получите набор сервисов, названных по сущностям: users, orders, products, notifications. Выглядит аккуратно, работает плохо. Такая нарезка почти гарантирует, что любое изменение бизнес-процесса заденет три сервиса сразу, а каждый запрос превратится в цепочку сетевых вызовов.

Границы сервиса проходят не по сущностям, а по данным, которые меняются вместе, и по командам, которые за них отвечают. Значит, и промт должен начинаться с данных.

Шаг 1. Границы по данным, а не по существительным

Ты — архитектор. Помоги найти границы сервисов для системы [описание].

ВХОДНЫЕ ДАННЫЕ:
Бизнес-процессы: [перечислить основные сценарии от начала до конца]
Данные: [основные сущности и их атрибуты]
Что меняется часто: [какие части системы правят чаще всего]
Команды: [сколько людей и кто за что отвечает]
Нагрузка: [где она реально высокая]

ЗАДАЧА:
Определи группы данных, которые изменяются в одной транзакции и не могут быть разделены без потери согласованности.
Для каждой границы: почему она проходит здесь, что окажется внутри, какие запросы станут сетевыми и чем это грозит.
Отдельно: какие из предложенных границ сомнительны и при каком условии их лучше не проводить.
Не предлагай сервисов, чья единственная задача — CRUD над одной таблицей.

Последний запрет отсекает половину типичных «архитектур»: сервис, который только читает и пишет свою таблицу, — это не сервис, а слой доступа к данным, вынесенный за сеть.

Шаг 2. Честный разговор о цене

Для предложенного разбиения перечисли, что станет сложнее по сравнению с монолитом.
Конкретно: какие операции потеряют транзакционность и как их придётся переделать; где появится согласованность в конечном счёте и что увидит пользователь в промежутке; сколько сетевых вызовов будет в самом частом сценарии; что понадобится для отладки распределённого запроса; как выкатывать несовместимые изменения контрактов.
Оцени, какой минимальный набор инфраструктуры нужен, чтобы это эксплуатировать.
В конце ответь прямо: оправдано ли разделение при команде в [N] человек, или разумнее модульный монолит.

Последний вопрос стоит задавать всерьёз. Микросервисы решают организационную задачу — дать командам работать независимо. При команде из пяти человек они добавляют инфраструктурную сложность, не решая никакой проблемы.

Шаг 3. Контракты до диаграмм

Опиши контракты между сервисами.
Для каждого взаимодействия: синхронное или через события, и почему именно так.
Для синхронных: метод, входные и выходные данные, коды ошибок, тайм-аут, поведение вызывающего при недоступности.
Для событий: имя события в прошедшем времени, состав полезной нагрузки, кто публикует, кто подписан, что делать при повторной доставке.
Отметь взаимодействия, где синхронный вызов создаёт цепочку зависимостей длиннее двух звеньев.

Шаг 4. Диаграмма

Собери диаграмму в PlantUML.
Компоненты — сервисы, стрелки — взаимодействия, сплошные для синхронных вызовов, пунктирные для событий.
Подпиши на каждой стрелке, что передаётся.
Хранилища показывай отдельными элементами, привязанными к своему сервису: общая база у двух сервисов должна быть видна на схеме как проблема.
Добавь легенду. Код должен компилироваться без внешних библиотек.

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

Что проверить в получившейся схеме

ПроверкаПлохой признак
Длина цепочки вызововБольше двух синхронных звеньев подряд
Общие хранилищаЕсть хоть одно
Двусторонние связиСервисы вызывают друг друга
Центральный узелОдин сервис связан со всеми
Изменение процессаПравка одного сценария трогает больше двух сервисов

Последняя строка — главный тест. Возьмите реальное изменение из вашего бэклога и проведите его по схеме. Если оно задевает половину системы, границы проведены не там, и лучше узнать это сейчас, а не через год.

Похожие вопросы

1 ответ

обсуждение открыто
0
26 августа 2026 00:07
Вот готовый промт. Скопируйте, заполните блок ВХОДНЫЕ ДАННЫЕ и отправьте модели.


Ты — архитектор систем. Задача: спроектировать микросервисную архитектуру, начиная с границ данных, а не сущностей. Диаграмма PlantUML — последний артефакт.

### ВХОДНЫЕ ДАННЫЕ (ЗАПОЛНИ ЭТО):
Бизнес-процессы: [перечисли основные сценарии от начала до конца, например: "Оформление заказа -> Оплата -> Сборка -> Доставка"]
Данные: [основные сущности и атрибуты, например: "User(id, email, role), Order(id, user_id, status, total), Product(id, sku, stock)"]
Что меняется часто: [какие правила/поля правят чаще всего, например: "Скидки, статусы заказа, способы доставки"]
Команды: [сколько людей и кто за что отвечает, например: "2 бэкенд-команды по 4 человека, 1 DevOps"]
Нагрузка: [где она реально высокая, например: "Чтение каталога — 5k RPS, запись заказов — 200 RPS"]

---

### ШАГ 1. ГРАНИЦЫ ПО ДАННЫМ (НЕ ПО СУЩЕСТВИТЕЛЬНЫМ)
Определи группы данных, которые изменяются в одной транзакции и не могут быть разделены без потери согласованности.
Для каждой границы укажи:
1. Почему она проходит именно здесь.
2. Что окажется внутри (агрегаты, логика).
3. Какие запросы станут сетевыми и чем это грозит (задержки, сложность).
4. Какие границы сомнительны и при каком условии их лучше не проводить.

**Жёсткий запрет:** не предлагай сервисов, чья единственная задача — CRUD над одной таблицей. Это не сервис, а слой доступа к данным, вынесенный за сеть.

---

### ШАГ 2. ЧЕСТНЫЙ РАЗГОВОР О ЦЕНЕ
Для предложенного разбиения перечисли, что станет сложнее по сравнению с модульным монолитом:
1. Какие операции потеряют ACID-транзакционность и как их придётся переделать (саги, outbox, компенсации).
2. Где появится eventual consistency и что увидит пользователь в промежутке.
3. Сколько сетевых вызовов в самом частом сценарии (путь запроса).
4. Что понадобится для отладки распределённого запроса (traces, logs, correlation IDs).
5. Как выкатывать несовместимые изменения контрактов (версионирование, consumer-driven contracts).
6. Минимальный набор инфраструктуры для эксплуатации (K8s, service mesh, broker, observability stack, CI/CD maturity).

**Вердикт:** Оправдано ли разделение при команде в [N] человек, или разумнее модульный монолит? Ответь прямо.

---

### ШАГ 3. КОНТРАКТЫ ДО ДИАГРАММ
Опиши взаимодействия между выделенными сервисами.
Для **синхронных** (REST/gRPC): метод, вход/выход (JSON/Proto схемы), коды ошибок, таймаут, поведение вызывающего при недоступности (retry/fallback/fail fast).
Для **событий** (Kafka/RabbitMQ): имя события в прошедшем времени (`OrderPlaced`), payload, publisher, subscribers, идемпотентность/обработка дублей.
Пометь вызовы, создающие цепочки синхронных зависимостей длиннее 2 звеньев.

---

### ШАГ 4. ДИАГРАММА PLANTUML
Сгенерируй код PlantUML (C4 Container level или Component).
Требования:
- Компоненты = сервисы.
- Сплошные стрелки `->` — синхронные вызовы (подпиши: `HTTP/JSON: DTO`).
- Пунктирные стрелки `-.->` — события (подпиши: `Kafka: EventName`).
- Базы данных — отдельные элементы `Database("Name")`, привязанные к сервису стрелкой `->` без метки вызова.
- **Общая база у двух сервисов = ошибка архитектуры, должна быть видна явно.**
- Легенда: `legend right` с обозначением стрелок и цветов.
- Код должен компилироваться в стандартном PlantUML (без `!include` внешних библиотек, используй стандартные спрайты/стили).

---

### ЧЕК-ЛИСТ КАЧЕСТВА (ПРОВЕРЬ СВОЮ ЖЕ СХЕМУ)
| Проверка | Плохой признак |
| :--- | :--- |
| Длина цепочки вызовов | > 2 синхронных звеньев подряд |
| Общие хранилища | Есть хоть одно |
| Двусторонние связи | Сервисы вызывают друг друга циклически |
| Центральный узел | Один сервис связан со всеми (God Service) |
| Изменение процесса | Правка одного сценария трогает > 2 сервисов |

**Финальный тест:** Возьми реальное изменение из бэклога (например, "добавить новый тип скидки, завязанный на склад и пользователя"). Проведи его по схеме. Если задевает половину системы — границы неверны. Укажи, где именно ломается изоляция.


---

### Как пользоваться
1. Замените [N] в вердикте на реальное число инженеров.
2. Заполните блок ВХОДНЫЕ ДАННЫЕ максимально конкретно: модель не угадает контекст вашего бизнеса.
3. Если модель на Шаге 1 предложит UserService, OrderService, ProductService — верните её на Шаг 1 с комментарием: *«Это нарезка по сущностям. Найди границы по транзакционности данных и владению командами»*.
4. Код диаграммы (Шаг 4) копируйте в [PlantUML Online](https://www.plantuml.com/plantuml/uml/) или IDE для рендера.

Ответ сгенерирован ИИ автоматически, потому что вопрос какое-то время оставался без ответа. Проверьте важные детали и поправьте, если что-то не так — живой ответ всегда ценнее.

Добавление комментария

Не публикуется. Нужен для уведомлений об ответах.
Отвечайте по существу: решение, а не «у меня то же самое».
Кликните на изображение чтобы обновить код, если он неразборчив