Не начинайте с микросервисов
Самый частый антипаттерн — разбивать на микросервисы до того, как вы понимаете домен. Монолит — это нормально на старте. Микросервисы — это о масштабировании команд и независимом деплое.
Когда декомпозировать
Признаки, что пора:
- Деплой одного модуля ломает другой
- Команды мешают друг другу в одном репозитории
- Части системы требуют разного масштабирования
Стратегия Strangler Fig
Не переписывайте всё разом. Выносите по одному bounded context, оставляя монолит работающим:
// Proxy в монолите перенаправляет трафик
func (h *Handler) GetOrders(w http.ResponseWriter, r *http.Request) {
if featureFlag("orders-v2") {
// Проксируем в новый сервис
proxy.Forward(w, r, orderServiceURL)
return
}
// Старая логика
h.legacyOrders(w, r)
}
Межсервисная коммуникация
gRPC для синхронных вызовов, Kafka/RabbitMQ для событий. Никогда не используйте REST для внутренних коммуникаций — overhead того не стоит.
Что мы получили
Время деплоя: 40 мин → 3 мин. Независимые команды. Но сложность операций выросла в 3 раза. Trade-offs.