Распределённые системы#

Когда сервисов больше одного: CAP, модели согласованности, идемпотентность, ретраи, saga, outbox, Kafka и RabbitMQ.

Оглавление#

Статьи идут в порядке чтения: от базы к деталям. Всего 12 статей.

  • CAP теорема — CAP — это не «выбери два из трёх».
  • Модели согласованности — Модель согласованности — это контракт о том, что тебе разрешено прочитать после того, как кто-то что-то записал.
  • Eventual Consistency — Eventual consistency обещает ровно одно: если записи прекратятся, все копии рано или поздно сойдутся к одному значению.
  • Идемпотентность в распределённых системах — Идемпотентность — свойство операции, при котором повторный вызов с теми же данными не меняет результат.
  • Ретраи: backoff, jitter, budgets и идемпотентность — Повтор запроса после сбоя — самая простая мера надёжности и самый простой способ добить сервис окончательно.
  • Circuit Breaker — Предохранитель перестаёт долбить зависимость, которая явно лежит, и начинает сразу возвращать ошибку, не тратя время на ожидание.
  • Гарантии доставки сообщений: at-most-once / at-least-once / exactly-once — Гарантия доставки определяется одним решением: когда потребитель отправляет подтверждение — до обработки сообщения или после.
  • Transactional Outbox — Задача звучит безобидно: сохранить заказ в базу и отправить событие в Kafka.
  • Saga Pattern — Saga — способ провести бизнес-операцию через несколько сервисов, когда общей транзакции у них нет и быть не может.
  • Apache Kafka — Kafka — это не очередь, а журнал: сообщения не исчезают после прочтения, а лежат заданное время, и каждый потребитель сам помнит, до какого места он дочитал.
  • RabbitMQ: AMQP 0-9-1, маршрутизация, надёжность доставки и сравнение с Kafka — RabbitMQ устроен по принципу «умный брокер, простой потребитель»: логика доставки живёт в брокере, и он сам решает, в какие очереди положить сообщение и кому…
  • Консенсус и Raft: репликация состояния в присутствии отказов — Консенсус — задача договориться о едином решении, когда часть узлов может внезапно умереть, а сообщения — потеряться или прийти дважды.