Ответ
Микросервисная архитектура (MSA) и сервис-ориентированная архитектура (SOA) — это два разных подхода к декомпозиции монолитных приложений на сервисы. Основные различия с точки зрения разработки и тестирования:
| Критерий | SOA | MSA |
|---|---|---|
| Гранулярность | Крупные, многофункциональные сервисы (например, «Сервис заказов»). | Мелкие, автономные сервисы, отвечающие за одну бизнес-возможность (например, «Сервис расчета стоимости доставки»). |
| Способ коммуникации | Часто через централизованную шину (ESB), которая управляет маршрутизацией и трансформацией данных. | Легковесные протоколы (HTTP/REST, gRPC, асинхронные сообщения). Сервисы общаются напрямую или через простой брокер сообщений. |
| Управление данными | Общая база данных или несколько тесно связанных БД. | Каждый сервис владеет своей собственной базой данных (принцип bounded context из DDD). |
| Связность и независимость | Сервисы тесно связаны через общие контракты и ESB. | Сервисы слабо связаны, могут разрабатываться, развертываться и масштабироваться независимо. |
Для QA это означает разный подход к тестированию:
- В SOA фокус на интеграционное тестирование через ESB, проверку сложных бизнес-процессов и контрактов (XSD, WSDL).
- В MSA критически важны:
- Изолированные модульные тесты для каждого сервиса.
- Контрактное тестирование (например, с Pact) для проверки взаимодействия между сервисами.
- Тестирование устойчивости (resilience testing) — как сервисы ведут себя при отказе соседних сервисов.
- Сквозное (E2E) тестирование ключевых пользовательских сценариев, проходящих через несколько сервисов.
Пример теста для микросервиса на Python (с использованием pytest и requests):
import pytest
import requests
SERVICE_URL = "http://user-service:8080"
def test_user_creation_and_retrieval():
"""E2E-сценарий: создание пользователя и получение его данных."""
# 1. Создание пользователя
create_payload = {"username": "test_user", "email": "test@example.com"}
create_resp = requests.post(f"{SERVICE_URL}/users", json=create_payload)
assert create_resp.status_code == 201
user_id = create_resp.json()["id"]
# 2. Получение созданного пользователя
get_resp = requests.get(f"{SERVICE_URL}/users/{user_id}")
assert get_resp.status_code == 200
user_data = get_resp.json()
assert user_data["username"] == "test_user"
assert user_data["email"] == "test@example.com"
SOA часто применяется в крупных корпоративных системах с унаследованной инфраструктурой, а MSA — в облачных приложениях, где важны скорость разработки, независимость команд и горизонтальное масштабирование.