我在大学里有这个任务,他们要求我们将
Java应用程序作为具有多个客户端的套接字服务器运行.客户端发送一个字符串,服务器以大写形式返回带有请求计数器的字符串.非常简单.
任何给定客户端发出的每个请求都在服务器端计算,并存储在每个客户端连接线程的静态变量中.这样每个客户端请求都会在服务器上全局递增计数器.这很好用.
现在,他们要求我们在网络上的不同计算机上运行该服务器的“备份”实例,以便在主服务器停止响应时,客户端连接到其中一个备份.那,我开始工作了.但计数器显然已重置,因为它是一个不同的服务器.
挑战在于主要和次要的请求计数器是相同的,因此如果主要响应10个请求,然后关闭,客户端切换到备份并发出请求,则备份服务器响应11.
这是我考虑的:
>如果在同一台PC上,我会使用线程,但我们在网络上,所以我
相信这不会奏效.
>服务器将该计数器发送给客户端
响应,然后将其返回到服务器
下一个请求等等.不是非常“干净”的imo但可以工作.
>每个服务器相互通信以同步此计数器.但是,套接字
如果可能的话,这样做似乎没有效率. RMI
似乎是一个替代方案,但我想在我之前确认
开始学习它.
这里有任何线索或建议吗?我没有发布代码,因为我不需要这里的解决方案,但如果有必要,我可以邀请到gihub回购.
编辑:此项目没有延迟,可靠性或类似约束.有X个客户端和Y个服务器(单个主服务器,多个故障转移).像DB这样的其他第三方基础设施实际上不是一种选择,但欢迎使用第三方Java库.基本上我只是在多台PC上运行Eclipse.这是对分布式系统的介绍,预计在2周内完成,因此我认为“保持简单”是关键!
编辑2:备份服务器的数量和地址将作为参数传递给应用程序,因此不需要广播/发现.我们可能会在学期后期的实验作业中涵盖所有这些要点:)
编辑3:从你所有的好建议,我将尝试实现#3的一些变体,让你知道它是如何工作的.我认为我在这里遇到的问题是确保所有服务器都知道其他服务器.但就像我提到的那样,他们不需要发现彼此,所以我现在将硬编码,并在下一个任务中重新访问!可能选择一些当选的主人…… 🙂