如何从Elixir Ecto检测数据库连接问题?

rin*_*ter 5 database load-balancing elixir ecto

我正在编写一个Elixir项目,通过Ecto连接到Postgres数据库.数据库服务器与应用程序本身位于不同的服务器上,并且与在同一硬件上运行时相比,更容易受到不会影响Elixir项目的中断.

当应用程序正常启动时,数据库连接似乎是自动进行的,一切正常.但是如果出现连接错误,Ecto只会将任何错误发送到日志中.

我想要做的是检测当前的连接状态,并通过简单的插件路由将该信息报告给外部负载均衡器,以便可以将流量路由到具有活动连接的单独服务器.

麻烦的是,我不确定如何确定Ecto是否与数据库有可行的连接,除了监听日志,然后报告数据库连接已经恢复.

我可以调用什么来确定Ecto连接是否正常并且可用,最好不要对该连接进行无操作查询?

Dmi*_*dov 3

Ecto 只是将任何错误写入日志中。

这是连接启用的backoff默认策略。backoff_type您可以通过在 repo 选项中设置为 来禁用退避:stop并自行处理错误。

我可以调用什么来确定 Ecto 连接是否有效且可用,最好不要对该连接进行无操作查询?

我认为您可以仅通过使用它来检查连接是否“可用”:)

try do
  Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT 1")
rescue
  e in DBConnection.ConnectionError -> :down
end
Run Code Online (Sandbox Code Playgroud)

顺便说一句,上面提到的模块是连接的默认池模块,您可以依赖其内部(不要)并手动进行签出。可以实现自己的池来代替这个:)