Общий ответ на ваш вопрос заключается в том, что вам нужно две вещи:
- Флаг, указывающий, что система находится в режиме «записи моментального снимка»
- Очередь для хранения всехтранзакции, которые происходят, когда система находится в режиме моментального снимка
Что делать, если очередь переполнена, потому что процесс моментального снимка не достаточно быстрый, ну, вы не можете многое сделатьоб этом, кроме как оптимизировать этот процесс или увеличить размер своей очереди - это будет баланс, который вам придется соблюдать в зависимости от потребностей вашего приложения.Это тонкий баланс, и он будет проходить довольно обширное тестирование, в зависимости от того, насколько сложна ваша система.
Но вы на правильном пути.Если вы в основном переводите систему в «режим записи моментальных снимков», то ваши методы чтения / записи должны автоматически менять место чтения / записи, чтобы поток, который вносит изменения, получал все «текущие значения», а поток, читающийСнимок состояния читает все «значения снимка».Вы можете разделить их на отдельные методы - программа чтения снимков будет использовать методы «значение снимка», а все остальные потоки будут читать методы «текущее значение».
Когда программа чтения снимков завершит свою работу,ему необходимо очистить состояние моментального снимка.
Если поток пытается прочитать «значения моментального снимка», когда в данный момент не установлено «состояние моментального снимка», он должен просто ответить «текущими значениями».Не важно.
Системы, которые позволяют делать снимки файловых систем для целей резервного копирования, не препятствуя записи новых данных, следуют аналогичной схеме.
Наконец, если вам не нужно сохранятьзапись всех изменений в системе (т. е. для контрольного журнала), тогда очередь транзакций фактически не должна быть очередью изменений, которые нужно применить - она просто должна хранить последнее значениелюбой вещи, которую вы меняете в системе.Когда «состояние моментального снимка» очищается, вы просто записываете все эти неподтвержденные значения в систему и вызываете это.Вы можете подумать о том, чтобы сделать записи о тех изменениях, которые еще предстоит сделать, на случай, если вам необходимо восстановиться после сбоя и применить эти изменения.Файл журнала даст вам отчет о том, что произошло, и может позволить вам сделать это восстановление.Это упрощение процесса восстановления, но это не совсем то, о чем идет речь, поэтому я на этом остановлюсь.