Вам нужно определиться с царством «закрыть».Под этим я подразумеваю, сколько чисел вы готовы потерять в случае сбоя.
Скажем, его 1000.
Тогда вы сохраните самую большую последовательность в файле.
Когда пришло время для обновления, вы записываете новый номер в новый файл, а затем переименовываете его поверх старого файла.Это атомарная операция в современных файловых системах, она либо работает, либо нет, поэтому она похожа на коммит в базе данных.Это гарантирует, что у вас есть место для новой информации о последовательности, и должно произойти сбой без ущерба для текущей информации о последовательности, если произойдет что-то действительно неблагоприятное.
В случае сбоя необходимо ОСТАНОВИТЬ и прервать генератор последовательности.
Ключевым моментом здесь является то, что номер в файловой системе больше, чем любой выданный номер.Таким образом, вы должны гарантировать, что он никогда не окажется ниже текущего выданного номера, или он будет повторно использовать номера при перезапуске.
Итак, вот процедура.
function int getNextSequence() {
currentSeq = currentSeq + 1;
if (currentSeq >= maxSeq) {
maxSeq = maxSeq + 1000;
write(maxSeq, "newSeq");
rename("newSeq", "curSeq");
}
return currentSeq;
}
function restartSequence() {
maxSeq = read("curSeq");
currentSeq = maxSeq - 1; // This will immediately create a disk update on first use.
}
Может быть одиношибка здесь, не проверено.
Дополнения:
Если вас это беспокоит, вы можете сохранить в памяти четыре фрагмента данных и выписать две копии.Или, лучше, шесть и три.
Данные, которые вы храните в памяти, представляют собой три копии счетчика и три контрольные суммы этих счетчиков (возможно, MD5 значения).
Затем, когда вы пишетеих, вы используете ту же технику, что и выше, напишите, затем переименуйте.
Но вы пишете значения и хэши.
Причина, по которой вы делаете это, проста.
Если значения последовательности не совпадают с их хэш / контрольной суммой, вы знаете, что пара ошибочна.
У вас есть три копии, исходя из того, что возможно одно повреждение, а не только на диске,но и в памяти - не забывайте о потенциальных ошибках памяти (если вы хотите стать параноиком, идите до конца, как я говорю), но сам факт искажения, затрагивающего более одного, астрономически маловероятен.
Когдавы обнаруживаете неудачную пару, у вас есть три выборки на выбор, и каждая выборка является «голосованием».Выберите два, которые соответствуют официальному значению, восстановите это значение и двигайтесь дальше.