Mongo C ++ Driver - Как изменить настройки тайм-аута - PullRequest
1 голос
/ 13 июня 2019

Как я могу изменить продолжительность тайм-аута для разных операций, которые могут потерпеть неудачу из-за недоступности сервера? (start_session, insert, find, delete, update, ...)

...
auto pool = mongocxx::pool(mongocxx::uri("bad_uri"), pool_options);
auto connection = pool.try_acquire();
auto db = (*(connection.value()))["test_db"];
auto collection = db["test_collection"];

// This does not help
mongocxx::write_concern wc;
wc.timeout(std::chrono::milliseconds(1000));
mongocxx::options::insert insert_options;
insert_options.write_concern(wc);

// takes about 30 seconds to fail
collection.insert_one(from_json(R"({"name": "john doe", "occupation": "_redacted_", "skills" : "a certain set"})"), insert_options);

[редактировать]
Вот сообщение об исключении:

C ++ исключение с описанием "Не найдено подходящих серверов: serverSelectionTimeoutMS истекло: [истекло время ожидания соединения ismaster на '127.0.0.1:27017']

1 Ответ

2 голосов
/ 13 июня 2019

Было бы полезно увидеть фактическое сообщение об ошибке из операции insert_one(), но «для сбоя требуется около 30 секунд», что может быть связано с таймаутом выбора сервера по умолчанию. Вы можете настроить это с помощью опции строки соединения serverSelectionTimeoutMS.

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

Среднее время, по истечении которого кластер выбирает новый первичный элемент, обычно не должно превышать 12 секунд

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

Если вы не подключаетесь к набору реплик, не стесняйтесь понизить serverSelectionTimeoutMS до более низкого значения, хотя оно все еще больше, чем ожидаемая задержка для вашего mongod (автономного) или mongos (сегментированного кластера) узла.

Обратите внимание, что поскольку выбор сервера происходит в цикле , опция строки подключения connectTimeoutMS не повлияет на задержку, которую вы видите. Уменьшение времени ожидания подключения позволит драйверу внутренне отказаться при попытке подключения к недоступному серверу, но выбор сервера будет по-прежнему блокировать до serverSelectionTimeoutMS (и, вероятно, повторять попытки подключения к серверу во время этого цикла).

...