Это — специализированный протокол для инкрементального обновления ПО с минимальными задержками. Расскажем, как он устроен, и кто его использует.
Что за Wharf, и почему он появился
Многие из инструментов для сборки и применения патчей являются проприетарными. Кроме того, они потребляют большое количество сетевых ресурсов. Авторы онлайн-сервиса для хостинга и продажи инди-игр itch.io разработали протокол для этих целей и передали его в open source. Он помогает гейм-девелоперам на платформе оперативно выпускать итерации патчей, а игрокам — актуализировать библиотеки.
Протокол использует простые алгоритмы, чтобы генерировать патчи на стороне клиента и не загружать код на сервер для оценки изменений. Такой подход позволяет вносить инкрементальные правки и сокращает стоимость обслуживания бекенда.
Что под капотом
Решение использует открытую спецификацию для патчей и сигнатурных файлов на базе protobuf. Также в основе diff- и patch-алгоритмов протокола лежит rsync.
Первый алгоритм описывает механизм для вычисления различий между двумя контейнерами (так авторы называют наборы файлов и папок). Каждый файл разбит на блоки в 64 Кбайта. Система сканирует измененные файлы на наличие кусочков с содержимым, совпадающим со имеющейся версией, а затем сохраняет их смещение и индекс файла внутри контейнера. Когда похожие блоки заканчиваются, свежие данные пишутся в патч секциями по 4 Мбайта.
Что касается второго алгоритма, то он непосредственно отвечает за обновление версии контейнера и его запись на диск. Создает отсутствующие директории и файлы, генерирует необходимые симлинки. Если вы хотите поближе познакомиться с этим протоколом и использовать его, неплохой стартовой точкой будет документация. Внести туда дополнения можно с помощью pull-запросов в репозитории на GitHub.
Больше открытых альтернатив
Существуют и другие инструменты для применения патчей — например, open source библиотеки bsdiff/bspatch. Они работают с бинарными файлами и были разработаны инженером Колином Персивалем из Оксфордского университета.
Первая утилита сравнивает старые и измененные файлы, а затем сохраняет отличия в виде двоичного патча. За его применение и развертку уже отвечает bspatch.
Еще один алгоритм для установки обновлений — Courgette. Правда, он заточен под работу с патчами для браузера Chrome. Что интересно, авторы разработали его в качестве альтернативы уже упомянутого bsdiff. Исходный код проекта можно найти на Google Git, и в него до сих вносят дополнения.
Больше о нестандартных решениях, работе провайдеров, протоколах, ИТ-стандартах — в нашем корпоративном блоге: