#209

Простейший журнал

Допустим, у тебя есть формат хранения и ты хочешь сделать так, чтобы данные в файле всегда были целостными. Тебе нужно журналирование.

Простейший журнал делается так. В начале файла выдели 8 байт, заполни их нулями. Там будет жить указатель на самые актуальные данные. При добавлении чего-либо в файл просто допиши данные в конец, а затем сохрани в начале файла смещение на эти данные, с какого байта они начинаются. Секрет прост: процесс записи в файл может оборваться в любую секунду, в том числе и прямо посередине. Но мы можем рассчитывать на то, что 64-битный указатель либо весь запишется, либо весь не запишется. Соответственно, этот указатель всегда будет показывать на целую корректную запись. Чтение по такому же принципу: сначала прочитай указатель, затем данные по смещению.

Этот принцип масштабируется и вглубь и вширь. Можно реализовать его и в JSON-формате. Можно реализовать его на уровне записи. Можно реализовать его линками на уровне файловой системы.

Тут важно понять саму концепцию, а не думать байтами и файлами. Например, я в одном проекте на Amazon S3 переставлял линк на самый свежий файл после загрузки — это тоже журнал.