Українська
Підсумки
Висновки
Мікросервіси – архітектурний стиль, у якому застосунок складається з автономних сервісів із власними даними, що розгортаються незалежно й взаємодіють лише через мережу. Вони дають незалежне масштабування, розгортання й технологічну свободу команд ціною розподіленості: мережевих затримок і відмов, узгодженості в кінцевому підсумку, складнішої інфраструктури й налагодження, тому починати варто з модульного моноліту. Межі сервісів проводять за бізнес-можливостями й обмеженими контекстами DDD. API-шлюз (YARP) приховує внутрішню структуру від клієнтів, виконує маршрутизацію, автентифікацію, обмеження частоти й агрегацію, а виявлення сервісів (Aspire, DNS Kubernetes) звільняє код від адрес. Замість розподілених транзакцій використовують саги з компенсувальними діями; стан саги зберігають, а кроки роблять ідемпотентними, щоб відновлюватися після збоїв. Transactional Outbox гарантує, що подія буде опублікована тоді й лише тоді, коли зміну даних зафіксовано, а Inbox відсікає повторні доставки: у перевірці жодна подія не загубилася під час зупинки брокера і жодне замовлення не отримало двох доставок. Тайм-аути, повтори й запобіжник перетворили зупинку платіжного сервісу з 6-секундних зависань на відмови за 23 мс з подальшою автоматичною компенсацією. Розподілене трасування OpenTelemetry показало весь шлях замовлення (31 спан у шести сервісах), а інтеграційні тести Aspire.Hosting.Testing перевіряють систему разом із реальними базою й брокером.
Питання для самоперевірки
- Чим відрізняються моноліт, модульний моноліт і мікросервіси? Коли мікросервіси не потрібні?
- Що таке обмежений контекст? Чому одна модель «товару» для всіх сервісів шкідлива?
- Як закон Конвея впливає на межі сервісів?
- Чому доступність ланцюжка синхронних викликів знижується? Обчисліть її для 4 сервісів з доступністю 99,5 %.
- Чим подія відрізняється від команди? Чим хореографія відрізняється від оркестрації?
- Які функції виконує API-шлюз? Що таке BFF?
- Як у YARP описують маршрути й кластери? Як шлюз знаходить адреси сервісів в Aspire?
- Чому кожен сервіс повинен мати власну базу даних? Що таке узгодженість в кінцевому підсумку?
- Що таке CQRS і проєкції? Коли вони потрібні?
- Чому двофазна фіксація непридатна для мікросервісів? Як працює сага?
- Що таке компенсувальна дія? Чим вона відрізняється від відкату транзакції?
- Як зберігається стан оркестрованої саги? Що робить служба відновлення?
- Що таке подвійний запис? Як його розв’язує Transactional Outbox?
- Чому ретранслятор Outbox дає доставку «щонайменше один раз»? Як Inbox усуває дублікати?
- Навіщо ключ ідемпотентності в запиті створення замовлення?
- Які стратегії стійкості використовують між сервісами? Як працює запобіжник?
- Які параметри має стандартний обробник стійкості .NET і чому їх змінюють?
- Як контекст трасування передається через HTTP, gRPC і RabbitMQ? Що робити з Outbox?
- Як версіонувати API й події? Що таке контрактні тести?
- Як написати інтеграційний тест з
Aspire.Hosting.Testing? - Чим відрізняються стратегії розгортання rolling update, blue–green і canary?
Корисні посилання
- Архітектура мікросервісів .NET: https://learn.microsoft.com/dotnet/architecture/microservices/
- Стиль мікросервісів: https://learn.microsoft.com/azure/architecture/guide/architecture-styles/microservices
- Межі мікросервісів: https://learn.microsoft.com/azure/architecture/microservices/model/microservice-boundaries
- API-шлюзи: https://learn.microsoft.com/azure/architecture/microservices/design/gateway
- YARP: https://learn.microsoft.com/aspnet/core/fundamentals/servers/yarp/yarp-overview
- Патерн Saga: https://learn.microsoft.com/azure/architecture/patterns/saga
- Transactional Outbox: https://learn.microsoft.com/azure/architecture/best-practices/transactional-outbox-cosmos
- Стійкість HTTP-застосунків: https://learn.microsoft.com/dotnet/core/resilience/http-resilience
- Виявлення сервісів в Aspire: https://aspire.dev/fundamentals/service-discovery/
- OpenTelemetry для .NET: https://opentelemetry.io/docs/languages/dotnet/
- Тестування з Aspire: https://aspire.dev/testing/overview/
- Pact: https://docs.pact.io/