Лучший способ "мьютекса", чем использование файла .lock по сети? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть небольшая установка, состоящая из 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, но не смог найти там ничего на мьютексе.

Любые мысли приветствуются!

...