У меня есть приложение на основе окон на основе клиентского сервера, для которого требуется только экран администратора. Функциональность администратора должна быть реализована таким образом, чтобы в любой момент времени доступ к этому экрану мог получить только один администратор. Окно формирует клиентское приложение на сервере с помощью .NET Remoting. А серверная часть распределена на нескольких машинах.Как сделать ресурс (экран) доступным только одному пользователю за раз в распределенном приложении .Net?
ответ
Это можно сделать наиболее легко с помощью таблицы БД. Обычно БД является отказоустойчивым и является безопасным ресурсом для совместного использования. Просто закройте таблицу блокировки, которая содержит некоторую информацию о заблокированном ресурсе, у которого есть это, когда и т. Д.
Вы также можете использовать один из различных «государственных серверов» на рынке для хранения состояния блокировки. Это вводит точку отказа, хотя, если вы не инвестируете в одну из новых технологий распределенного состояния.
Однако вы действительно настроились на дальнейшие проблемы. Вам понадобится экран, позволяющий форсировать разблокировку, просмотр того, кто имеет блокировку, и т. Д. Лучше всего смотреть на то, почему этот замок действительно нужен. Это требование технологии или бизнеса? Вы можете более легко и чисто реализовать пессимистический сценарий обновления данных, который улучшит работу пользователя.
Вам необходимо поддерживать статический член на сервере, который указывает, используется ли это окно. Убедитесь, что он является потокобезопасным, используя функцию lock() при настройке значения. Затем вы можете проверить это значение перед отображением экрана администратора.
Что касается серверной части, вы указываете, что она существует на нескольких ПК. Является ли это сбалансированным балансом типа топологии, который работает как один виртуальный сервер? Если это так, вам может потребоваться сохранить значение в базе данных. Подумайте об этом так же, как в ASP.Net сохраняется Состояние сеанса. Я могу существовать на сервере, но если есть ферма серверов, его можно перенести на SQL Server для использования всеми серверами.
Первый абзац не имеет отношения к серверной топологии. Второй абзац имеет значение. – TheSoftwareJedi 2008-12-09 20:36:30
Если у вас есть SqlServer в вашем стеке, вы можете использовать встроенные функции распределенной блокировки через [этот пакет NuGet] (https://github.com/madelson/DistributedLock). – ChaseMedallion 2016-03-15 11:36:50