// Типичная структура монолита
public class MonolithicApp
{
private Database _db;
private AuthService _auth;
private ReportGenerator _reports;
private PaymentProcessor _payments;
public void ProcessOrder(Order order)
{
_auth.Validate();
_payments.Process(order);
_db.Save(order);
_reports.Generate(order);
}
}
// Сервис заказов
public class OrderService
{
public void CreateOrder(Order order)
{
// Вызов других сервисов через HTTP/gRPC
_paymentService.Process(order.Payment);
_inventoryService.Reserve(order.Items);
}
}
// Отдельный сервис платежей
public class PaymentService
{
public void Process(Payment payment)
{
// Логика обработки платежа
}
}
Характеристика | Монолит | Распределенная система |
---|---|---|
Масштабируемость | Вертикальное (увеличение ресурсов сервера) | Горизонтальное (добавление экземпляров сервисов) |
Развертывание | Единое для всего приложения | Независимое для каждого сервиса |
Отказоустойчивость | Единая точка отказа | Отказы изолированы в отдельных сервисах |
Сложность разработки | Проще в начале, сложнее при росте | Сложнее изначально, но управляемее при масштабировании |
Производительность | Локальные вызовы - быстрее | Сетевые задержки между сервисами |
Согласованность данных | Сильная (ACID) | Слабая (BASE), eventual consistency |
Технологический стек | Единый для всего приложения | Разные технологии для разных сервисов |
// Пример REST вызова между сервисами
public class OrderService
{
private readonly HttpClient _paymentClient;
public async Task ProcessPayment(PaymentRequest request)
{
var response = await _paymentClient.PostAsJsonAsync("/payments", request);
response.EnsureSuccessStatusCode();
}
}
Проблемы распределенных систем:
// Каждый сервис со своей БД
public class CatalogService
{
private readonly CatalogDbContext _db;
// ...
}
public class OrderService
{
private readonly OrderDbContext _db;
// ...
}
Проблемы:
// Распределенный трейсинг
var activity = ActivitySource.StartActivity("ProcessPayment");
try
{
// Вызов сервиса
}
finally
{
activity?.Stop();
}
Необходимые инструменты:
// Независимые версии сервисов
[ApiVersion("1.0")]
[Route("v{version:apiVersion}/orders")]
public class OrdersController : ControllerBase
{
// ...
}
Преимущества:
// JWT токен для межсервисной аутентификации
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://auth-service";
});
Сложности:
выбор между монолитом и распределенной системой зависит от масштаба проекта, требований к масштабируемости и компетенций команды. Монолиты проще для небольших проектов, тогда как распределенные системы лучше подходят для сложных, высоконагруженных приложений с требованиями высокой доступности. Современные подходы часто используют гибридные решения (микросервисы + модульный монолит).