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
会一直阻塞,直到资源准备就绪,因此在重新连接时,活动请求可以轻松等待