Golang中如何在关闭HTTP服务器时同时停止其他服务
Golang中如何在关闭HTTP服务器时同时停止其他服务 你好,
我有点怀疑自己是否在应用程序关闭时过度设计了,即手动关闭其他服务的连接。
以下是我目前的做法。调用 DB.Close 或 REDIS.Close 到底有没有好处?我的意思是,HTTP 服务器已经关闭了,所以我相信所有其他服务也会自动终止。我这样想对吗?
func shutdown( // ...) {
// ...
// chan := make(chan os.Signal, 1)
// signal.Notify(signChan, os.Interrupt, syscall.SIGTERM)
if err := HTTPServer.Shutdown(ctx); err != nil {
// ...
}
if err := DB.Close(); err != nil {
// ...
}
if err := REDIS.Close(); err != nil {
// ...
}
}
更多关于Golang中如何在关闭HTTP服务器时同时停止其他服务的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢 @geosoft1。了解这些细节很好。我也会坚持显式关闭与其他服务的连接。
更多关于Golang中如何在关闭HTTP服务器时同时停止其他服务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
规则是完成操作后自行清理。这意味着要正确关闭连接、文件,删除锁文件等。
@NobbZ 感谢您的及时回答和解释。最后需要澄清一点,由于HTTP关机监听特定的操作系统信号以实现优雅地关闭服务器,我相信按照您所说的,手动关闭外部资源以强制清理断开连接是一种理想的做法。我这样理解对吗?
手动关闭与外部资源的连接通常能确保干净地断开连接,并等待仍在向套接字写入数据的其他Go协程完成操作。而强制退出虽然确实会关闭连接,但由于超时或当前正在运行的事务可能被取消/回滚,外部服务可能需要一段时间才能意识到连接已断开。
引用 GoingToGo:
我只是在想,通过手动关闭其他服务连接来实现应用程序关闭,是否有些过度设计了。
除了“善后清理”是一个好习惯之外,在你这个具体案例中,使用 Redis 似乎必须这样做,因为你无法确定数据库是否有超时设置。
默认情况下,新版本的 Redis 不会因为客户端空闲数秒而关闭连接:连接将永远保持打开状态。
但是,如果你不喜欢这种行为,可以配置一个超时时间,这样如果客户端空闲超过指定的秒数,客户端连接就会被关闭。
Redis 客户端处理 Redis 服务器如何管理客户端连接

