2014-12-20 4 views
1

Я написал веб-службу REST, которая использует mongo в качестве хранилища данных. Мне было интересно на этом этапе (до развертывания), каковы были лучшие методы, учитывая сервис, который по существу работает вечно (ish).MGO и длинные веб-службы - восстановление

В настоящее время я после этого типа шаблона:

// 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, который я использую, удален, поэтому я предполагаю, что это произойдет), поэтому при любом вызове конкретной веб-службы сеанс базы данных может перестать работать? Как люди справляются с этими случаями, чтобы обнаружить, что сеанс больше не действителен, и нужно установить «новый»?

Спасибо!

+0

Я * думаю *, что для вас управляются соединения и переподключения - ['mgo' docs] (http://godoc.org/gopkg.in/mgo.v2) говорят, что он сделает« одно или несколько соединений », за сеанс. Это немного похоже на то, как ['sql.DB' специфицирует пул соединений в' database/sql'] (http://golang.org/pkg/database/sql/#DB). не отвечая, потому что это только сильное подозрение, а не то, во что я полностью уверен. – twotwotwo

ответ

2

то, что вы можете это сделать сеанс .Copy() для каждого запроса входящего HTTP (с deffered .Close()), копировать снова с новой сессии в обработчиках, если когда-либо необходимо ..

соединения и пересоединение управляется МдО , вы можете остановить и перезагрузить MongoDB, сделав HTTP-запрос к вашему веб-сервису, чтобы узнать, как его затронуло.

если есть проблема подключения к БД при обработке запроса HTTP, операция дб будет в конечном итоге ожидания (тайм-аут может быть сконфигурирована с помощью DialWithTimeout вместо обычного Dial, так что вы можете ответить с кодом ошибки 5xx HTTP в таком случае.