У меня есть следующие требования к приложению, которое многие люди будут использовать в офисе - нет компонента сервера. Все экземпляры клиентских приложений должны каким-то образом вести переговоры между собой, чтобы решить, какой клиент будет выполнять роль сервера. И клиенты должны общаться между собой через IP.
Если и когда клиентское приложение опускается, другой клиент должен взять на себя беспрепятственно. Я понимаю, что иметь сервер будет намного проще. Но поскольку приложение должно быть очень устойчивым, полномочия, которые не хотят рисковать сервером (или даже его резервное копирование), а скорее полагаются на эту гибридную связь с сеткой, где роль сервера переполняется от клиента к клиенту.
Я думаю, что я подключился к приложениям. В основном, когда приложение запускается, оно объявляет себя через UDP (либо предопределенный IP-адрес, который все слушает, либо через широковещательную рассылку UDP). Оттуда сообщение происходит аналогичным образом.
В части, с которой я столкнулся, есть вопрос о том, как согласовать/самостоятельно организовать между клиентами, чтобы выбрать один с ролью сервера. И как надежно обнаружить, что клиент спустился, а затем необходимо провести новые переговоры. Последней трудностью является копирование данных, которые были накоплены клиентом с ролью сервера.
Я создал прототип в С#, который обменивается данными и пытается реплицировать данные, но часть переговоров (особенно в сочетании с отказом клиента).
Сначала я подумал, что сделал ZeroConf (он же Bonjour). Но это только объявляет о доступных сетевых сервисах.
В любом случае, я не хочу заново изобретать, и я не могу быть первым, кто захочет это сделать. Итак, мои вопросы:
- Есть ли образец, который уже реализует то, что я описал выше?
- Если да, есть ли для этого доступная библиотека .NET(или даже родная)?
- Каковы хорошие способы согласования роли сервера среди клиентов?