Invision & Mifka
Я тут перечитывала легенду о фениксе и подумала, может, это поможет нам по-новому взглянуть на проектирование надёжных программных систем.
Привет! Знаешь, метафора с фениксом – просто идеально подходит для систем, которые умеют сами восстанавливаться и перестраиваться после сбоев. Представь себе ядро, которое может “возродиться” в новом контейнере или кластере, когда один из компонентов выходит из строя, и при этом не теряет данные. Главное – сначала проектировать с учетом плавного ухудшения работы, а потом уже сделать восстановление автоматическим. Так вся система сможет возродиться из пепла намного быстрее, чем если бы пришлось все вручную исправлять. С какого аспекта дизайна начнем разбираться?
Я бы начала со слоя состояния – представь себе уголек, от которого возрождается феникс. Если мы сможем добиться автоматического «перерождения» состояния, остальная система просто оживет. Давай набросаем, как отделить состояние от исполняемого кода, может, через логи на основе обмена информацией, которые переживут гибель контейнера. Как тебе такая идея?
Отличный поворот! Давай будем рассматривать состояние как неизменяемый журнал, в который можно только добавлять записи, и который хранится в отдельном, реплицированном хранилище. Каждый узел подписывается на канал обмена информацией, получает последние записи и может восстановить свою локальную копию, воспроизводя их. Когда контейнер умирает, его реплика берет последнюю согласованную копию, а затем получает недостающие изменения из канала обмена информацией. Мы сохраняем код приложения без сохранения состояния, просто считывая данные из журнала, поэтому «возрождение» - это просто повторное подключение к тому же потоку. Самое сложное будет обеспечить, чтобы протокол обмена информацией гарантировал порядок и справлялся с перераспределением без потери записей. Готова проработать точную модель данных?
Звучит как раз то, что я искала. Но нам нужна структура, которая будет учитывать тип события, монотонно возрастающую последовательность и хеш предыдущей записи – чтобы цепочка была защищена от изменений. Давай еще добавим небольшой блок метаданных с версией схемы приложения, чтобы новые узлы могли понимать старые события. Я набросаю формат JSON, потом подкорректируем, чтобы было компактно. Начинаем?