【问题标题】:How do I check Monger connection in a Luminus app (MongoDB not available)?如何在 Luminus 应用程序中检查 Monger 连接(MongoDB 不可用)?
【发布时间】:2021-06-17 18:47:35
【问题描述】:

我正在学习 Clojure (1.10),并正在使用 Luminus 框架 (3.93) 编写一个小型 Web 应用程序,使用 Monger 客户端 (3.1.0) 连接到 MongoDB 实例。 Luminus 会生成一些脚手架代码,即在<myproject>.db.core 启动时创建数据库连接池(使用函数monger.core/connect-via-uri):

(ns myproject.db.core
  (:require [monger.core :as mg] ... ))

(defstate db*
  :start (-> env :database-url mg/connect-via-uri)
  :stop (-> db* :conn mg/disconnect))

...

我的问题:如果此时 MongoDB 实例不可用,则不会显示任何警告问题的信息。提供网页,直到需要调用 Monger 函数。此时,应用程序“搅动”,然后超时(设置为 30 秒)并出现异常/堆栈跟踪错误屏幕(这除了是一种可怕的用户体验之外,还可能暴露本应保密的代码/数据)。

当必备数据库不可用时,如何最好地防止启动应用程序?

一个(诚然笨拙的)初始尝试是在上述启动代码中插入一个 Monger 调用。这会在启动期间导致超时异常(带有异常消息),而不是启动 Web 应用程序。 有什么更好的方法?

另外,您是否知道一种方法可以让此类问题停止启动过程,而不是重试并大量输出失败消息?

(defstate db*
  :start (-> env :database-url mg/connect-via-uri
             ; clumsy way to catch timeouts due to no database when starting up:
             (#(mg/get-db-names (:conn %)) %))
  :stop (-> db* :conn mg/disconnect))

【问题讨论】:

    标签: mongodb clojure luminus monger


    【解决方案1】:

    我不是 Monger 方面的专家,但他们网站上的 this guide 显示了更改超时的方法。

    所以,也许将超时更改为 3 秒或其他什么,然后看看你可以连接。否则,抛出异常什么的。

    【讨论】:

      【解决方案2】:

      您可以尝试ping db 以检查其可用性:

      (mg/command db {:ping 1})
      

      此外,您可以创建一个调度程序(例如这里this)来定期检查数据库的状态

      【讨论】:

      • 这不起作用,因为db 值来自connect-via-uri 调用,它会重试直到超时,因此永远不会到达ping。这也是它不能在其他任何地方使用的原因 - 首先需要一个 db 来 ping 它......我想可能没有一个好的解决方案......
      猜你喜欢
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多