我有一个应用程序的需求,许多人将在办公室使用它 - 没有服务器组件。所有客户端应用程序实例都应以某种方式进行协商,以决定哪个客户端将承担服务器角色。并且客户端应该通过IP相互通信。
如果客户端应用程序崩溃,另一个客户端必须无缝地接管。我知道拥有服务器会简单得多。但由于应用程序必须非常弹性化,所以权力机构不想冒险使服务器(甚至是备份)崩溃,而是依赖于这种混合网状连接,在客户端之间跳转服务器角色。
我认为应用程序连接已经解决了。基本上,当应用程序启动时,它会通过UDP(向所有内容都监听的预定义IP地址或通过UDP广播)宣布自己的存在。从那里开始,通信就以类似的方式进行。
我遇到的问题是如何在客户端之间协商/自组织以选择扮演服务器角色的客户端。以及如何可靠地检测客户端已经停机,然后必须进行新的协商。最后的困难是复制由具有服务器角色的客户端累积的数据。
我在C#中创建了一个原型,它可以通信并尝试复制数据,但是协商部分(特别是与客户端故障耦合的部分)仍有问题。
最初我以为这就是ZeroConf(也称为Bonjour)所做的。但是那只会宣布可用的网络服务。
无论如何,我不想重新发明轮子,我也不可能是第一个想要做到这一点的人。所以我的问题:
- 是否有实现我上述描述的模式?
- 如果是,是否有可用的.NET(甚至native)库?
- 在客户端之间协商服务器角色的好方法是什么?