Что означает Availability (доступность) в CAP-теореме?

«Что означает Availability (доступность) в CAP-теореме?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В CAP-теореме (Consistency, Availability, Partition Tolerance) свойство Availability (A, Доступность) означает, что каждый запрос к распределенной системе гарантированно получает ответ (успешный или с ошибкой), даже если часть узлов системы вышла из строя.

Ключевые аспекты:

  • Не 100% uptime: Речь не о постоянной работе, а о том, что работающие узлы продолжают обслуживать запросы, несмотря на отказы других узлов или сетевые разделения (Partition).
  • Компромисс с Consistency: В условиях сетевого раздела (P) система, выбравшая Availability (AP-система), жертвует строгой согласованностью (C). Клиенты могут получать устаревшие данные с разных узлов.

Пример AP-системы: Кластер баз данных с асинхронной репликацией (например, Cassandra, DynamoDB в определенных конфигурациях). Если реплика теряет связь с мастером, она продолжает отвечать на запросы чтения своими (возможно, устаревшими) данными.

Псевдокод, иллюстрирующий приоритет Availability:

public class APDatabase {
    // При сетевом разделении узел отвечает своими данными, даже если они устарели
    public Data getData(String key) {
        // Не ждем синхронизации с другими узлами
        return localReplica.get(key); // Всегда возвращаем ответ
    }
}

Важно: В реальности полной доступности или согласованности не существует. Современные распределенные системы (например, через механизмы кворумов, согласованного хеширования) стремятся к практическим компромиссам, часто описываемым моделью PACELC, которая расширяет CAP для сценариев без сетевых разделений.