Команда BuildBuddy решила проблему передачи целых файлов в кэше, заменив это на работу с кусками. Технология Content-Defined Chunking (CDC) позволяет отправлять только изменённые части больших бинарников, библиотек или архивов. Если файл почти не изменился, система видит совпадение с существующими кусками и загружает только новые фрагменты. На бенчмарках это принесло экономии 40% трафика и уменьшило размер диска кэха на 40% при тестировании репозитория BuildBuddy.
Проблема возникала там, где один маленький правка в коде ломала хеш целого большого файла. События сборки, такие как связывание (Linking) или упаковка, часто объединяют много зависимостей в один результат. Изменение одной входной строки меняло хеш всего пакета, заставляя загружать его целиком, даже если 95% байтов остались прежними. Старый способ — отключать удалённый кэширование для таких задач, что убивало преимущества кэширования. CDC решает это универсально: алгоритм режет файл на куски по совпадению хешей, а не по фиксированным адресам.
При тестировании алгоритм FastCDC показал, что 85% данных уже существовали в кэше в виде старых кусков. За две недели в продакшене система пропустила около 300 терабайт дублирующихся данных при записи. В тестах с базой BuildBuddy экономили от 20 до 40% трафика в зависимости от размера файлов. Лучше всего это работает для сборок, где результат стабилен по байтам, например, для линкованных пакетов или несжатых бандлов. Сжатые архивы вроде tar.gz хуже подходят, так как изменение в конце файла меняет хеши всех последующих байтов в архиве.
Для включения нужны клиенты Bazel версии 8.7 или новее (включая 9.1+) с флагом --experimental_remote_cache_chunking. Сервер BuildBuddy обрабатывает нарезку кусков автоматически: он проверяет наличие фрагментов и загружает только недостающие. Клиент может передавать куски напрямую, не храня их в памяти целиком, а читая из исходного файла. Базовые API разделены на SplitBlob для чтения схемы кусков и SpliceBlob для записи метаданных, что позволяет оптимизировать сетевой трафик и равномерно заполнять хранилище без гигантских объектов.