Как мне обрабатывать создание и удаление сеансов с помощью mgo.v2?

Я подключаю веб-сервис golang к базе данных MongoDB. Я немного запутался в том, какой лучший и самый безопасный способ создания и хранения сеансов базы данных. В других языках я привык к подходу, при котором я могу открывать и закрывать соединение для каждого запроса, например (псевдокод)

conn = db.newConnection()
query = conn.query({id: 'my-id'})
conn.close()

что обеспечит правильное закрытие соединения и освобождение ресурсов. Всякий раз, когда возникает сбой подключения, это будет затронуто только временно. Не следует ожидать снижения производительности, поскольку базы данных сильно оптимизированы для такого поведения.

Теперь документы mgo на Dial() (которые используются для установления соединения) штат:

Этот метод обычно вызывается только один раз для данного кластера. Затем устанавливаются дополнительные сеансы в том же кластере с использованием методов New или Copy для полученного сеанса. Это заставит их совместно использовать базовый кластер и соответствующим образом управлять пулом соединений.

что привело к тому, что у меня было одно соединение на уровне пакета, которое я создаю в пакете init и которое затем используется всеми экземплярами клиентов:

var database *mgo.Database
// Setup runs all the needed steps to establish a database connection
func Setup() error {
    var sessionErr error
    mongoSession, sessionErr = mgo.Dial(os.Getenv("MONGO_HOST"))
    if sessionErr != nil {
        return sessionErr
    }
    database = mongoSession.DB(os.Getenv("DB_NAME"))
    return nil
}

Это работает нормально, но я сталкиваюсь с проблемами, когда примерно раз в месяц соединение с базой данных теряется и не может быть восстановлено в течение времени жизни процесса (заставляя все запросы возвращать EOF и требуя, чтобы кто-то перезапустил процесс). Я никогда не видел, чтобы это происходило при использовании описанного выше подхода «подключи-и-закрой-по-каждому-запросу».

Я почти уверен, что делаю что-то не так, но я чувствую, что делаю то, что говорят мне документы, и все примеры, которые я могу найти в Интернете, являются одноразовыми вещами, которые не охватывают случай долго работающего приложения.

Каков рекомендуемый способ обработки соединений Mongo безопасным способом внутри долго работающих приложений с использованием mgo? Существует ли установленная схема использования Copy() или New() которые упоминаются в документации? Предотвратит ли их использование постоянные сбои соединений?


person m90    schedule 18.07.2017    source источник
comment
Проверьте этот стек, так как некоторые из ваших проблем решаются здесь сеанс mgo"> stackoverflow.com/questions/26574594/   -  person reticentroot    schedule 18.07.2017
comment
@reticentroot круто, спасибо, что откопал, почему-то не смог найти.   -  person m90    schedule 18.07.2017