【问题标题】:Spring Boot Connection Exception When DB Outage数据库中断时的Spring Boot连接异常
【发布时间】:2021-11-05 05:53:51
【问题描述】:

我正在用Spring boot应用连接MongoDB,我的情况是MongoDB意外宕机,抛出连接异常、mongodb连接超时异常和socket异常。

我想在 Spring Boot 中捕获上述异常,然后关闭应用程序。我尝试使用 HealthIndicator 中的 @schduled,它每 3 秒在 DB 中执行一个简单命令并捕获一般异常,它可以工作,但它不是正确的方法,因为多个实例会产生大量负载。

不幸的是,我不能使用@controlleradvice 和@exceptionhandler,因为我不想通过执行查询抛出任何异常。带有查询的命中数据库会给具有多个实例的数据库带来负载。

有什么办法可以处理我的情况吗?

【问题讨论】:

  • 为什么要在 mongo 关闭时关闭 Spring Boot 应用程序?您是否考虑过使用 Spring Boot Actuator 来告诉您的客户服务已关闭且尚未准备好接受请求?看看这个问题/答案 - stackoverflow.com/questions/41803253/…
  • 是的,但我的业务用例是想要关闭,因为它从 Kafka 读取。企业想要关闭而不是停止从 Kafka 读取数据。

标签: spring mongodb spring-boot spring-data-mongodb


【解决方案1】:

与其“关闭”您的应用程序,不如实施circuit breaker,而不是“关闭”您的应用程序,您可以在其中为远程依赖项失败(在您的情况下为 mongodb 连接超时)提供合适的回退。已经有很好的库可以开箱即用地实现这一点,并且非常容易使用 Spring Boot 进行配置。您可以查看HystrixResilience4JSentinel

如果您仍想继续使用之前的 ping MongoDB 方法,则可以在依赖项中包含 Actuator 并使用 MongoHealthIndicator 自行检查状态。它在内部运行一个查询

@Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        Document result = this.mongoTemplate.executeCommand("{ buildInfo: 1 }");
        builder.up().withDetail("version", result.getString("version"));
    }

你可以

【讨论】:

  • 感谢您的意见,让我看看。
  • 我尝试了相同的方法,但业务尚未准备好采用此选项,因为多个实例对数据库的大量命中。它将对 DB 造成过载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2016-12-10
  • 2016-12-20
  • 1970-01-01
  • 2018-06-03
  • 2020-09-03
相关资源
最近更新 更多