Синхронизация в распределенных системах. Часть 1: Основные задачи
В распределённых системах, как правило, возникает необходимость синхронизации данных между компонентами. Сетевые взаимодействия подвержены сбоям. Если сообщение доставлено и корректно обработано — возникает рассинхронизация.
Основные задачи:
Доставка сообщений. Для обеспечения доставки в первую очередь необходимо обеспечить канал передачи
Подтверждение получения. Важно понимать, действительно ли получатель принял сообщение. Для этого необходимо подтверждение. Компоненты могут расходиться в состоянии, если одно из них считает, что сообщение отправлено, а второе — его не получило.
Подтверждение обработки. Даже если сообщение получено, возможно получатель не смог его обработать, необходимо выработать план действий на такой случай
Дублирование сообщений. Повторы сообщений (например, при retry) приводят к неопределённости: считать ли повтор допустимым или уже применённым. Это особенно критично, если дублирующее сообщение меняет состояние (сообщение не идемпотентно).
Нарушение порядка. Если синхронизация основана на последовательности шагов, то изменение порядка доставки может привести к переходу системы в некорректное состояние.
Задержки и тайм-ауты. В условиях непредсказуемых сетей становится трудно отличить потерю сообщения от его запаздывания. Это приводит к «раздвоению реальности» — один компонент считает, что шаг не удался, другой — что он ещё в процессе.
Согласование изменений (coordination)
Иногда одного сообщения недостаточно — нужно координировать состояние нескольких компонентов:
- двухфазный коммит (2PC),
- распределённые блокировки,
- протоколы консенсуса (Paxos, Raft).
Обнаружение сбоев и компенсация. Система должна обнаруживать рассинхронизацию и уметь на неё реагировать: тайм-ауты, компенсационные транзакции, рестарт операций, ручное вмешательство.
Восстановление после сбоя После сбоя компоненты должны вернуться к согласованному состоянию:
- реплей логов,
- снэпшоты,
- механизмы reconciliation (сверка состояния).
9. Понимание семантики состояний Например, если система работает с бизнес-сущностями (платёж, заказ, резерв), то синхронизация — это не только передача данных, но и соблюдение бизнес-инвариантов, чтобы оба узла пришли к одинаковому интерпретируемому состоянию.
Comments
So empty here ... leave a comment!