У меня есть небольшая установка, состоящая из n клиентов (CL0, CL1, ... CL n ), которые обращаются к общему ресурсу windows на сервере.
На этом сервере файл json содержит важные данные, которые должны быть доступны для чтения и записи всем игрокам в игре. Он содержит пары ключ-значение, которые постоянно читаются и изменяются:
{
"CurrentActive": "CL1",
"DataToProcess": false,
"NeedsReboot": false,
"Timestamp": "2020-05-25 16:10"
}
Я уже сделал следующее с PowerShell: если клиент записывает файл, создается файл блокировки, который содержит имя хоста и временную метку доступ. После доступа файл блокировки удаляется. Каждое «задание» записи сначала проверяет, существует ли файл блокировки и действительна ли временная метка, а затем выполняет условную запись в файл после снятия блокировки.
#Some Pseudo Code:
if(!Test-Path $lockfile){
gc $json
}else{
#wait for some time and try again
#check if lock is from my own hostname
#check if timestamp in lock is still valid
}
Это работает нормально, но очень сложно для создания, поскольку мне нужно было реализовать механизм блокировки, а также способ принудительного снятия блокировки, когда клиент не может удалить файл по нескольким причинам (и я уверен, что также включил некоторые ошибки ...) . Кроме того, в некоторых случаях чтение файла возвращает пустой. Я предполагаю, что это находится в sweetspot во время записи файла другим клиентом, когда он сбрасывается, а затем заполняется новым содержимым.
Я искал другие варианты, такие как мьютекс, и он работает как шарм на одном клиенте с несколькими потоками, но поскольку они полагаются на SafeHandles в рамках одной системы, а не с несколькими клиентами по сети. Можно ли запустить мьютекс по сети с помощью
Я также наткнулся на AlphaFS, которая позволяет мне выполнять транзакционную обработку в файловой системе, но это не устраняет причину root, что несколько клиентов обращаются к одному файл одновременно.
Есть ли лучший способ сохранить данные? Я думал о Windows Registy, но не смог найти там ничего на мьютексе.
Любые мысли приветствуются!