У меня есть сервер, который предоставляет свое хранилище, похожее на файловую систему - на нем есть файлы, папки, и вы можете загружать файлы, скачивать файлы, копировать, перемещать, удалять и т. д. Нет абсолютно никакой возможности изменить интерфейс сервера (представьте себе FTP) . Также существует ограничение на длину имени файла.
У меня есть несколько клиентов, которым нужно использовать это хранилище одновременно. Единственный способ для них общаться через этот интерфейс файловой системы. Использование настраиваемого центрального сервера для синхронизации или одноранговой связи не допускается.
Как я могу реализовать удаленное хранилище значений ключа со стороны клиента, способное к транзакциям ACID, используя интерфейс этого сервера в качестве бэкэнда? Несколько клиентов могут одновременно получать доступ к хранилищу значений ключа или изменять его, и механизм блокировки должен быть реализован только с использованием открытого интерфейса файловой системы сервера.
Я могу легко превратить эту файловую систему в собственное хранилище ключей и значений, поэтому мне действительно нужна некоторая библиотека C#/.NET, которая добавляет транзакции в произвольное хранилище значений ключей. Мне не нужна производительность в стиле Facebook/Google, хранилище ключ-значение будет использоваться для экономии только десятков ГБ.
Предположим, удаленное хранилище ключей и значений позволяет мне использовать string get(id), void put(id, string) и delete(id) записей. Никакая другая информация не может быть получена с сервера (даже при ошибках не создаются исключения). Учитывая, что единственными клиентами, имеющими доступ к хранилищу, будут мои, как мне реализовать их так, чтобы только один мог одновременно писать/удалять (блокировка записи)? Учитывая очень-очень ограниченный серверный интерфейс, возможно ли это вообще? Я предполагаю, что решение потребует очень хорошего криптографического трюка, но я пока не смог придумать ничего, что сработало бы.
Ресурсы
- Как источник вдохновения, Распределенные блокировки с Redis кажутся довольно интересными.
System.Transactions.Transaction? - person Scott Chamberlain   schedule 04.01.2015moveилиrename, которая может перезаписать существующий файл, при этом конечный файл никогда не будет находиться в несогласованном состоянии? Также вы можете получить метаданные Время последней записи для файлов? - person Scott Chamberlain   schedule 04.01.2015get-content/put-content/delete. Однако из любопытства, как бы вы реализовали блокировку сmoveиlast write time? (Учитывая непредсказуемую задержку сети.) - person Paya   schedule 05.01.2015