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

我编写了一个使用 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 服务调用中,数据库会话可能不再有效?人们如何处理这些情况以检测会话不再有效并且应该建立一个“新”会话?


红颜莎娜
浏览 148回答 1
1回答

HUH函数

您可能想要的是.Copy()为每个传入的 HTTP 请求(使用 defered .Close())执行会话,如果需要,请从处理程序中的新会话再次复制..连接和重新连接由 mgo 管理,您可以停止和重新启动 MongoDB,同时向您的 Web 服务发出 HTTP 请求以查看其影响。如果在处理 HTTP 请求时出现数据库连接问题,数据库操作最终将超时(超时可以通过使用DialWithTimeout而不是常规配置Dial,因此在这种情况下您可以使用 5xx HTTP 错误代码进行响应。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go