Я проектирую архитектуру для набора служб WCF. Из-за характера развертывания этих сервисов (удаленно развернутых на нескольких неуправляемых системах на клиентских сайтах, поэтому мы не можем позволить себе административные издержки серверов баз данных), хранилище данных должно основываться на файлах (мы довольно сильно склоняемся к XML для формата файла).
Еще раз, природа сервисов означает, что существует вероятность проблем параллелизма в отдельных файлах, и я пытаюсь найти систему, которая будет вести себя корректно во всех случаях и избегать попыток чтения данных, когда есть ожидающая операция записи.
Мое нынешнее мышление выбирает один из двух возможных путей.
блокировка файлов
Это будет работать следующим образом.
Все файловые операции будут иметь механизм блокировки. Чтения будут проверять, чтобы убедиться, что требуемый файл в настоящее время не заблокирован, прежде чем запрашивать данные. Если файл заблокирован, служба должна находиться в спящем режиме в течение случайного числа миллисекунд (в пределах пока неопределенного диапазона). Операции записи устанавливают блокировку, фиксируют данные и затем разблокируют файл.
дополнительная программа в фоновом режиме для предоставления данных сервисам
Эта версия будет иметь вторичное приложение в фоновом режиме, предоставляя различные общедоступные статические методы, вызываемые сервисами. Фоновое приложение будет нести единоличную ответственность за поддержание представления данных в памяти, предоставление данных службам и синхронизацию копий файлов с объектами в памяти. В этом отношении он будет вести себя так, как если бы это был сервер баз данных с транзакциями.
Из двух (или, возможно, других) методов реализации цели создания таких сервисов, какой вариант обеспечит наибольшую производительность с наименьшей вероятностью конфликтов параллелизма? Простота конструкции варианта 1 означает, что я больше поддерживаю этот вариант, но я обеспокоен тем, что производительность может пострадать в результате операций "сна".