Что такое распределённая система?

«Что такое распределённая система?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Распределённая система — это архитектура, в которой компоненты, расположенные на разных сетевых компьютерах (узлах), координируют свои действия исключительно путём обмена сообщениями, чтобы представить пользователю единую, согласованную систему.

Ключевые характеристики и цели:

  • Масштабируемость: Возможность увеличивать производительность и ёмкость системы за счёт добавления новых узлов (горизонтальное масштабирование).
  • Отказоустойчивость: Система продолжает функционировать (возможно, с деградировавшей производительностью) при отказе одного или нескольких узлов или сетевых разделов.
  • Прозрачность: Для конечного пользователя или клиентского приложения система выглядит как единый логический компьютер (прозрачность доступа, расположения, миграции и т.д.).

Типичные примеры: кластеры баз данных (Cassandra, MongoDB replica set), микросервисные архитектуры, CDN, блокчейн-сети.

Пример взаимодействия (упрощённая схема на C# с gRPC):

1. Сервер (узел A):

// Определение и запуск gRPC сервера
var server = new Grpc.Core.Server
{
    Services = { Greeter.BindService(new GreeterServiceImpl()) },
    Ports = { new ServerPort("node-a.internal", 50051, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("Сервер Greeter запущен на порту 50051");

2. Клиент (узел B):

// Создание канала связи и вызов удалённого метода
using var channel = GrpcChannel.ForAddress("https://node-a.internal:50051");
var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(new HelloRequest { Name = "Distributed System" });
Console.WriteLine($"Ответ от сервера: {reply.Message}");

Основные сложности проектирования:

  • Согласованность данных (CAP-теорема): В условиях сетевого раздела (P) приходится выбирать между доступностью (A) и согласованностью (C).
  • Частичные отказы: Любая сетевая операция может завершиться неудачей. Необходимы стратегии повторных попыток, тайм-ауты, механизмы идемпотентности и откатов.
  • Сложность отладки и мониторинга: Требуются распределённые системы трассировки (OpenTelemetry, Jaeger) и агрегированное логирование.