Haskell 为所有服务器请求处理一个连接

Haskell 为所有服务器请求处理一个连接,haskell,Haskell,以下是代码: start :: Settings -> IO () start settings @ Settings {healthCheckLoggerId} = do waitTillHealthy healthCheckLoggerId settings Server.getDependencies Server.healthCheck Server.getDependencies settings (runServerOnWa

以下是代码:

start :: Settings -> IO ()
start settings @ Settings {healthCheckLoggerId}  = do
  waitTillHealthy
    healthCheckLoggerId
    settings
    Server.getDependencies
    Server.healthCheck
  Server.getDependencies
   settings
   (runServerOnWarp)

  where

    runServerOnWarp :: Server.Dependencies -> IO()
    runServerOnWarp dependencies @ Server.Dependencies {logger,port} = do
       run port $ application
                    (proxy :: Proxy GSDMonitoringStreamingApi)
                    monitoringServer
                    dependencies

    monitoringServer :: ServantServer GSDMonitoringStreamingApi Server.Dependencies
    monitoringServer dependencies = streamCommand dependencies
      where

        streamCommandResponse :: Server.Dependencies ->
                                 WorkspaceId ->
                                 Handler (PipeStream (Either StreamIssue (Persisted CommandResponse)))
        streamCommandResponse Server.Dependencies {eventStoreClientDependencies} =
          return . toPipes . GsdMonitoring.streamCommandResponse eventStoreClientDependencies

对问题的解释:

函数
Server.getDependencies
正在包装一个括号模式,用于获取到数据库的连接(该数据库的客户端建议对所有请求使用一个连接,而不是对每个请求使用一个连接)。 首先我要做一个健康检查,直到一切正常为止。每次我测试依赖项的健康检查时,每次我获取新连接时。一旦环境正常,我将再次获得
Server.Dependencies
(db连接),并运行服务器。运行到
runServerOnWarp
中的所有内容都在
-->computiation to running in between
部分中执行

bracket
        :: IO a         -- ^ computation to run first (\"acquire resource\")
        -> (a -> IO b)  -- ^ computation to run last (\"release resource\")
        -> (a -> IO c)  -- ^ computation to run in-between
        -> IO c         -- returns the value from the in-between computation
所以所有的请求都被执行到该部分并得到相同的连接,到目前为止还不错。。。因为该部分:

run port $ application
              (proxy :: Proxy GSDMonitoringStreamingApi)
              monitoringServer dependencies
永远不会结束,我们总是停留在
计算中,在
之间运行(除非我关闭应用程序…)

现在我遇到的问题是连接何时关闭。。。。我的所有请求都将返回Left StreamIssue,这很好,但我必须从Server.getDependencies获得一个新连接。我不知道如何正确操作:-(我想到但我不喜欢的黑客是:

1) 一个请求有一个连接

2) 当请求流出现左流问题时引发异常,以某种方式重新启动服务器以获取新的依赖项。。。问题是,服务器的客户端从未获得左值,并且由于服务器重新启动,2之间的通信被严重关闭

你有没有更干净的方法


附言:我希望这些细节足以理解这个问题,如果有必要,请不要犹豫获取更多信息

如果丢失数据库连接的情况很少,那么让服务器崩溃,并让一些监控进程重新启动,效果会很好

如果丢失数据库连接的情况非常普遍,以至于您无法容忍重新启动服务器时出现客户端超时,则可以向使用数据库连接的任何代码添加重新连接逻辑。我通常用这个。我相信,如果适合您的数据库,您可以使用一种资源创建“池”

通常获得DB连接是很快的,所以我猜将传入的请求路由到其他地方并不值得付出额外的努力<
resource pool
中的code>withResource
会一直阻塞,直到资源准备就绪,因此在重新连接时,活动请求可以轻松等待