Java 如果服务器崩溃,我应该如何处理?

Java 如果服务器崩溃,我应该如何处理?,java,sockets,crash,server,Java,Sockets,Crash,Server,我想知道我是否有两个服务器,一个是“主”服务器,另一个就在那里(两个都使用相同的后端代码)。如果主服务器崩溃,我希望我的客户机使用另一台服务器,这样他们就不必重新启动程序或类似的事情,我应该如何处理 我已经阅读了使用欺负算法的相关知识,但是我不知道如何处理客户端在第一台主服务器上使用的套接字和数据(消息),以及如何在第二台服务器上使用这些套接字和数据。首先,如果服务器崩溃,您无法处理驻留在其中的数据因此,如果您不想在发生故障时丢失数据,您应该使用分布式(NoSQL?)数据存储(如Cassandr

我想知道我是否有两个服务器,一个是“主”服务器,另一个就在那里(两个都使用相同的后端代码)。如果主服务器崩溃,我希望我的客户机使用另一台服务器,这样他们就不必重新启动程序或类似的事情,我应该如何处理


我已经阅读了使用欺负算法的相关知识,但是我不知道如何处理客户端在第一台主服务器上使用的套接字和数据(消息),以及如何在第二台服务器上使用这些套接字和数据。

首先,如果服务器崩溃,您无法处理驻留在其中的数据因此,如果您不想在发生故障时丢失数据,您应该使用分布式(NoSQL?)数据存储(如Cassandra、Redis、DynamoDB等),因为他们已经以可扩展的方式解决了这个问题

第二,如果您的问题是“A出现故障时如何将请求从A路由到B”,您可以使用一个简单的(例如,基于NodeJS的)代理前端服务器A和B。最初,代理将“转发”所有客户端请求到A。当A崩溃时,代理会检测到(可能是当它看到所有转发的请求在过去的x秒内超时时)并切换到服务器B。 但是,会有一个很小的时间窗口(取决于您配置的x值),客户机请求将持续失败


听起来您正试图在应用程序级别(例如在Java/sockets代码中)实现“故障切换”。我不鼓励您这样做

以下是一些可能更稳健的备选方案:

  • 实施群集web服务器和/或群集数据库服务器:

  • 实现代理:

  • SQL数据库的高可用性

  • 最后,为了回答您最初关于在应用程序级别实现故障切换的问题,以下是几个示例:

增编:

  • 您可能还想看看:
  • 如果您在服务器上存储了不希望在服务器停机时丢失的任何状态,请将您的状态存储在两个特定的数据库服务器上—一个主服务器和一个副本。如果您不知道选择哪个数据库服务器,请告诉我,我将向您询问其他问题以提供帮助
  • 如果使用服务器的客户端代码在您的控制之下,则在其中实现所有容错逻辑。最简单的方法是“循环”,即连接到随机服务器,直到找到为您的请求服务的服务器。有关详细信息,请搜索“循环”
  • 如果客户端代码不在您的控制之下,那么您应该使用BGP负载平衡。其主要思想是,一旦一台服务器停机,另一台服务器将获得第一台服务器的IP地址,例如在客户端,一切都是完美的。有关更多详细信息,请使用谷歌“BGP负载平衡”

  • 在集群中设置服务器怎么样?这是什么意思?我对网络编程有点陌生。我想知道更多关于如何将数据从一台服务器重定向到另一台服务器的信息@luigimendozan您是否将数据存储在数据库或分布式缓存中?如果您维护缓存,则不需要更改应用程序。第二台服务器暗示从缓存中获取数据。如果您使用的是数据库,您可以从数据库中重新加载崩溃服务器的相关数据并继续。是的,它没有存储在数据库中。但是如何处理?如果我的主服务器崩溃,我不会丢失数据?我如何在崩溃服务器和“新”服务器之间发送数据一个?@Sunrise76谢谢你提供的所有链接。事实证明,我的问题并没有被“精确地”问到。我只是想投票作为答案,因为它看起来有很多信息可以帮助我解决我的问题@paulsm4