Разрыв между двумя каналами не закрывается скоростью. Его закрывает единый пул доступности, из которого читают все каналы, — вместо нескольких копий, каждая уверенная в своей правоте.
Почти никогда двойное бронирование не вызвано медленной системой. Его вызывает то, что один и тот же номер записан в нескольких местах одновременно, и каждое место верит только своей копии. Пока правда существует в нескольких версиях, всегда будет момент, когда две версии не совпадут — и скорость делает этот момент короче, но никогда не убирает его полностью.
Представьте последний свободный номер на субботу, выставленный на двух каналах. Два гостя бронируют его с разницей в секунды. Каждый канал смотрит в свою копию доступности, видит номер свободным и подтверждает бронирование. К моменту, когда команда закрытия продаж доходит до второго канала, второе бронирование уже существует.
Никто не ошибся. Оба канала сработали именно так, как задумано. Проблема архитектурная: двум системам позволили одновременно считать, что они владеют одним и тем же номером.
Связать календари через iCal — самый распространённый первый шаг, и вполне разумный. Но iCal работает по принципу опроса: другая сторона сама забирает файл календаря по своему расписанию, обычно с интервалом в десятки минут, а иногда и дольше, если платформа загружена. В этом процессе нет ничего мгновенного и ничего гарантированного.
Переход от iCal к прямому подключению резко сокращает это окно — с минут до секунд. Это реальное улучшение, и оно убирает большинство случаев. Но оно не убирает саму категорию проблемы, потому что при построении на отправке данных всё равно существует несколько копий, которые согласуются постфактум.
Есть и более тонкий сбой, который скорость не устраняет. Некоторые каналы сами применяют автоматические корректировки доступности — например, возвращают номер при отмене. Если ваша система в этот же момент записывает абсолютное число, а канал применяет свою дельту, операции могут применяться в любом порядке — и результат иногда получается выше реального.
Структурное решение — перестать вести копии. Доступность рассчитывается из одного пула реальных номеров, а каждый канал — это просто представление этого пула, а не владелец части его. Когда бронирование приходит из любого источника, пул уменьшается, и каждый канал корректируется под новое число.
Этот последний пункт важнее, чем кажется. У системы, которая не может прочитать текущее состояние канала, есть два варианта: угадывать или сказать правду. Угадывать в сторону «вроде бы всё ещё свободно» — именно так номер продают два раза. Отказ угадывать — вот что отличает систему, которая обычно права, от системы, на которую можно реально рассчитывать в дни полной загрузки.