Найти тему
2016 подписчиков

👣 Mongo-driver Golang - реконнект к серверу Mongo


▶️Вопрос: как реализовано переподключение приложения на Golang к MongoDB в случае потери соединения в библиотеке go.mongodb.org/mongo-driver/mongo?

На локальном компьютере при отключении Mongo приложение в течение 30 секунд висит (видимо пытается подключиться).

Это время — оно задается в настройках клиента библиотеки или в самой Mongo или от чего еще зависит? Mongo поднята в контейнере, код подключения такой:
ctx, _ := context.WithTimeout(context.Background(), timeoutSecond*time.Second)

client, err := mongo.Connect(ctx, options.Client().ApplyURI(connString))

Сам запрос вот:
err := mr.client.Database(mr.dbName).Collection(mr.collName).FindOne(ctx, filter).Decode(&p)

▶️Ответ: можно контролировать работу этого приложения с помощью context.WithTimeout или context.WithCancel(ctx). Помимо этого, у вас имеется возможность настроить клиент к базе.
У клиента есть ряд параметров с таймаутами, одни для выполнения одной операции, другие отвечают за время подключения к серверу (можно сказать время отклика сервера).

⏩Когда мы кладём БД и исполняем запрос, то висит канал (go channel), который ожидает выполнения функции, либо завершения контекста, истечения timeout этого запроса.
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-selectionState.timeoutChan:
return nil, wrapServerSelectionError(ErrServerSelectionTimeout, t)
case current = <-subscriptionCh:
}
срабатывает <-selectionState.timeoutChan, по умолчанию его значение 30 секунд

⏩Документация говорит, что клиент нужно настроить следующим образом, чтобы продлить время ожидания отклика:
client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"),
options.Client().SetConnectTimeout(time.Second * myTimeout),
options.Client().SetServerSelectionTimeout(time.Second * myServerTimeout))

👣 Mongo-driver Golang - реконнект к серверу Mongo  ▶️Вопрос: как реализовано переподключение приложения на Golang к MongoDB в случае потери соединения в библиотеке go.mongodb.org/mongo-driver/mongo?
1 минута