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

时间:2014-12-20 16:47:33

标签: go mgo

我编写了一个使用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 个答案:

答案 0 :(得分:2)

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

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

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