теория

Два читателя у каждого сообщения

Смотри, вот что монолит от нас прятал. Пока весь код жил в одном куске и деплоился разом, у любого сообщения между модулями был ровно один читатель — та же версия кода, что его и записала. Компилятор сам следил, чтобы отправитель и получатель говорили на одном языке.

Как только сервисы деплоятся независимо, всё меняется: у сообщения теперь всегда два читателя — старый код и новый. И понять его должны оба. Отсюда два свойства, которые придётся держать в голове.

— новый код умеет прочитать то, что записал старый. Обычно даётся легко: пишешь новую версию, помня о старых данных.

— старый код умеет прочитать то, что записал новый. Вот это уже контринтуитивно: код, написанный сегодня, должен спокойно проглотить сообщение из будущего, о полях которого он ещё не слышал. Именно её сегодня и не хватило — старый обработчик Заказов не был готов встретить незнакомое поле.

Вместе они и есть — искусство менять формат так, чтобы никого не уронить. Правило одно, и оно простое: только добавляй. Новые поля — необязательные; старые не удаляй и не переиспользуй их имена и номера под новый смысл. Удалил обязательное поле — уронил тех, кто на него рассчитывал. Переклеил старое имя на новый смысл — уронил ещё коварнее: тихо и с порчей данных.

По сути — это договор через время: между кодом, который пишет сегодня, и кодом, который прочитает это и завтра, и вчера.

← назад