MGO и долго работающие веб-сервисы — восстановление

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

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

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

Спасибо!


person user2644113    schedule 20.12.2014    source источник
comment
Я думаю, что за вас управляют соединениями и повторными соединениями -- mgo docs< /a> сказать, что он будет устанавливать одно или несколько соединений за сеанс. Это немного похоже на то, как sql.DB используется для представления пула соединений в database/sql. . Комментирую, не отвечаю, потому что это только сильное подозрение, а не то, в чем я полностью уверен.   -  person twotwotwo    schedule 21.12.2014


Ответы (1)


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

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

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

person Gal Ben-Haim    schedule 27.12.2014