【问题标题】:Restarting requests in case server crashes/restarts (Spring Boot)在服务器崩溃/重新启动时重新启动请求(Spring Boot)
【发布时间】:2021-05-10 19:06:41
【问题描述】:

我正在开发一个应用程序来处理平均需要 10 分钟才能完成的异步请求。服务器是使用 Spring Boot 编写的,有 4 个副本,还有一个 负载均衡器。如果其中一个服务器在处理一定数量的请求时崩溃,我希望这些失败的请求以负载平衡的方式在其余服务器上重新启动。

注意:有一个公共数据库,我们在其中为每个传入请求创建一个唯一条目,并在成功处理该请求时删除该条目。

约束:

  1. 我们不能等待服务器重新启动。
  2. 没有额外的服务器来监视这些服务器。
  3. 服务器之间没有领导/从属架构。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java spring-boot server


    【解决方案1】:

    一种解决方案是使用消息队列来处理请求。我建议使用 Apache Kafka (Spring for Apache Kafka) 并提出以下解决方案:

    1. 创建 4 个 Kafka 主题。
    2. 当 4 个副本中的每一个收到请求时,将其发布到 4 个主题之一(随机),而不是简单地处理它。
    3. 每个副本将连接到 Kafka 并从一个主题消费。如果您让 Kafka 管理您的主题,那么每当一个副本崩溃时,其他 3 个副本中的一个就会选择其主题并开始在其位置上消费请求。
    4. 当崩溃的副本重新启动并连接到 Kafka 时,它可以再次从其主题开始消费(这种自动平衡已在 Kafka 中实现)。

    此解决方案的另一个优点是,如果您愿意,您可以停止使用数据库来存储请求,因为在这种情况下,Kafka 可以充当您的数据库。

    【讨论】:

    • 完美解决方案 Sebastian Grigor,但有一个问题,我们需要小心处理重新平衡,因为请求是长异步请求。