为了账号安全,请及时绑定邮箱和手机立即绑定

MGO 和长期运行的 Web 服务 - 恢复

MGO 和长期运行的 Web 服务 - 恢复

Go
红颜莎娜 2021-09-10 10:59:29
我编写了一个使用 mongo 作为后端数据存储的 REST Web 服务。我想知道在这个阶段(部署之前),考虑到一个基本上永远运行的服务(ish),最佳实践是什么。目前,我正在遵循这种模式:// database.go...type DataStore struct {  mongoSession  *mgo.Session}...func (d *DataStore) OpenSession () {   ... // read setup from environment   mongoSession, err = mgo.Dial(mongoURI)   if err != nil {}   ...}func (d *DataStore) CloseSession() {...}func (d *DataStore) Find (...) (results...) {    s := d.mongoSession.Copy()    defer s.Close()    // do stuff, return results}在 main.go 中:func main() {    ds := NewDataStore()    ds.OpenSession()    defer ds.CloseSession()    // Web Service Routes..    ...    ws.Handle("/find/{abc}", doFindFunc)    ...}我的问题是 - 从超时、丢失连接的会话中恢复的推荐做法是什么(我使用的 mongo 服务提供商是远程的,所以我假设这会发生),所以在任何特定的 Web 服务调用中,数据库会话可能不再有效?人们如何处理这些情况以检测会话不再有效并且应该建立一个“新”会话?
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

您可能想要的是.Copy()为每个传入的 HTTP 请求(使用 defered .Close())执行会话,如果需要,请从处理程序中的新会话再次复制..

连接和重新连接由 mgo 管理,您可以停止和重新启动 MongoDB,同时向您的 Web 服务发出 HTTP 请求以查看其影响。

如果在处理 HTTP 请求时出现数据库连接问题,数据库操作最终将超时(超时可以通过使用DialWithTimeout而不是常规配置Dial,因此在这种情况下您可以使用 5xx HTTP 错误代码进行响应。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信