Небольшие независимые снимки
Разделение помогает восстановлению, когда границы частей имеют ясный смысл.
Единица восстановления
Один большой файл удобен для последовательной передачи, но каждое исправление может требовать пересоздать его целиком. Независимые снимки по периоду или устойчивому разделу уменьшают объём повторной работы. Повреждение одной части не обязательно делает остальные непригодными, если каждая содержит полноценную структуру и собственные метаданные.
Слово «независимый» здесь означает возможность проверить и прочитать часть без скрытого состояния другой части. Кусок JSON-массива, разрезанный по произвольному байтовому смещению, этому условию не отвечает. Завершённый JSONL с контрактом записи подходит лучше, но всё равно требует версии схемы и описания границы набора.
Выбор раздела
Разделение по календарному дню удобно, когда данные действительно поступают по дням. Если события приходят с задержкой, старые разделы могут потребовать исправления. Нужно выбрать политику: неизменяемые версии, отдельные поправки или явная замена снимка. Замена файла без смены manifest скрывает историю и затрудняет повторение старого расчёта.
Разделение по идентификатору полезно для адресного восстановления, но распределение может быть неравномерным. Разделение по хешу даёт более ровные части ценой менее понятных имён. Нет универсального размера: учитывайте задержку открытия, число файлов, память читателя и стоимость повторной передачи. Сначала измерьте реальные ограничения процесса, а не выбирайте размер по чужому примеру.
Manifest набора
Manifest должен перечислять точный набор частей, а не предлагать читателю самостоятельно искать все подходящие имена. Иначе оставшийся старый файл случайно попадёт в обработку. Для каждой части полезны путь, размер, SHA-256, число записей и диапазон ключей, если последний действительно гарантирован. Для всего набора нужны версия и правило порядка.
Публикуйте manifest после подготовки частей или переключайте весь каталог атомарно. Получатель сначала фиксирует конкретный manifest, затем проверяет только перечисленные файлы. Так новый выпуск, появившийся во время скачивания, не смешивается со старым. Отсутствующую часть следует считать ошибкой комплекта, а не молча пропускать.
Изменение границ
При смене правила разделения создайте новую версию всего набора, а не смешивайте старые и новые части в одном каталоге без описания. Например, переход от месячных снимков к дневным меняет смысл полного комплекта. Получатель должен понимать, можно ли объединять два выпуска или они представляют альтернативные состояния. Запишите связь между версиями и определите, какие старые пути сохраняются. Для исправленной части полезно отдельное обозначение ревизии, но оно не отменяет необходимости нового manifest. Если вычисление зависит от набора целиком, сохраните идентификатор принятого manifest в журнале. Тогда поздняя коррекция одного дня не изменит задним числом объяснение уже опубликованного результата и не сделает повторный расчёт неоднозначным.
Цена большого числа файлов
Слишком мелкие части создают собственные расходы: обход каталогов, метаданные, большое число запросов и сложный учёт. Архив может упростить доставку, но его внутренняя структура всё равно должна сохранять manifest. Сжатие каждой части отдельно облегчает выборочное чтение, хотя иногда даёт другой коэффициент сжатия, чем один общий поток.
Проверяйте отсутствие пропусков и пересечений по логическим идентификаторам. Сумма числа строк не обнаруживает случай, когда одна запись повторилась, а другая исчезла. Если набор допускает дубликаты, опишите их смысл. Для событий важны идентификатор события и порядок, для справочника — уникальный ключ и версия значения.
Хороший снимок можно восстановить в новом пустом каталоге по одному manifest. Проведите такую пробу: проверьте суммы, соберите итоговое представление и сравните предметные агрегаты с исходником. После этого оцените время и место восстановления. Части имеют смысл не потому, что они маленькие, а потому, что их границы делают проверку, исправление и повторное использование управляемыми.