Я использую nuget MongoDB.Driver Version=2.17.1.
Иногда операция поиска зависает при выполнении запроса к базе данных Монго. И это замирание может длиться до 2 часов и более.
Вот как я вызываю find:
Set<EntityDto>().Find(x => x.Id == id).FirstOrDefaultAsync(cancellationToken);
Я попытался найти какие-либо варианты установки тайм-аута и нашел:
MongoClientSettings со многими свойствами, такими как ConnectTimeout, MaxConnectionIdleTime, MaxConnectionLifeTime, ServerSelectionTimeout, SocketTimeoutFindOptions со свойствами MaxAwaitTime, MaxTime.Но я не могу найти никакой документации, для чего служит каждое свойство. И не могу найти никаких значений по умолчанию, равных 2 часам.
Также я нашел здесь решение с cancelToken.
Но в любом случае я хотел бы узнать обо всех этих настройках в библиотеке Монго. Кто-нибудь знает, где найти объяснение или документацию?
Я конечно смотрел мониторинг mongo db у облачного провайдера, но ничего интересного там не нашел
какой именно мониторинг вам нужен? Для атласа вы можете использовать: mongodb.com/docs/atlas/monitoring-alerts . На стороне клиента вы можете настроить мониторинг следующим образом: stackoverflow.com/questions/78406949/… где вы можете собирать любые нужные вам метрики.
Я имел в виду мониторинг нагрузки. Облачный провайдер дает это, но нагрузка кажется нормальной. Спасибо за ссылки!





Подробности вы можете найти здесь. Опции в других драйверах и оболочках такие же, как и в драйвере C# (хотя возможны и небольшие различия в именах, связанные со стандартами языка).
maxTimeMS — то же самое, что MaxTime, поэтому настройте его в FindOptions. Подробности смотрите также здесь
ОБНОВЛЯТЬ:
maxtime отвечает за время выполнения команды на сервере. Он не включает время туда и обратно или время, необходимое драйверу для сериализации, выбора сервера и т. д. Поэтому не ждите слишком точных расчетов с точки зрения клиента.ConnectTimeout — Время в миллисекундах для попытки подключения до истечения времени ожидания. Смотрите здесьsocketTimeout - таймаут ответа сокета во время отправки/получения команд. Смотрите здесьServerSelectionTimeout - таймаут на поиск доступного сервера для работы. Смотрите здесьWaitQueueTimeout - Максимальное время, в течение которого поток может ожидать установления соединения. См. здесьMaxConnectionIdleTime — Максимальное время, в течение которого соединение может оставаться бездействующим в пуле, прежде чем оно будет удалено и закрыто. Смотрите здесьMaxConnectionLifeTime - насколько я помню, пришло время, когда соединение считается живым после создания в пуле.Итак, как вы можете видеть, каждый параметр таймаута отвечает за определенный этап взаимодействия с сервером. Насколько я понимаю, вам нужен тайм-аут на стороне клиента с высокой точностью. Тогда cancellationtoken — лучший вариант. Однако обратите внимание, что сервер не знает об этом, поэтому может возникнуть ситуация, когда операция будет выполнена на сервере, но cancelToken на клиенте приведет к сбою оставшихся внутренних шагов драйвера и, как следствие, полной операции.
Также в качестве примечания вы должны помнить, что когда вы вызываете, скажем, Find операцию, драйвер может фактически выполнить больше шагов, чем просто отправка вашей команды, по крайней мере, драйвер должен убедиться, что в пуле есть соединение. , сервер исправен, шаги сериализации... Итак, в вашем случае я бы не стал полагаться на тайм-аут на стороне клиента в 100 мс.
Я пытаюсь установить все таймауты, которые смог найти: Для клиента mongoClientSettings.ConnectTimeout = TimeSpan.FromMilli Seconds(100); mongoClientSettings.SocketTimeout = TimeSpan.FromMilli Seconds(100); mongoClientSettings.ServerSelectionTimeout = TimeSpan.FromMilli Seconds(100); mongoClientSettings.SocketTimeout = TimeSpan.FromMilli Seconds(100); mongoClientSettings.WaitQueueTimeout = TimeSpan.FromMilli Seconds(100); mongoClientSettings.MaxConnectionIdleTime = TimeSpan.FromMilli Seconds(100); mongoClientSettings.MaxConnectionLifeTime = TimeSpan.FromMilli Seconds(100);
Для запроса на поиск var result = await _db.EntityCollection .Find(x => x.Id == ResearchId, new FindOptions() { MaxAwaitTime = TimeSpan.FromMilli Seconds(100), MaxTime = TimeSpan.FromMilli Seconds(100) }) .FirstOrDefaultAsync( timeoutCancellationTokenSource.Token); Но запрос, который длится> 200 мс, все равно не прерывается, не знаю почему.
Единственное решение, которое я нашел до сих пор, — это cancelationToken в коде C#.
поскольку максимальное время — это время выполнения команды на сервере, оно не включает время туда и обратно или время, необходимое драйверу для сериализации, выбора сервера и т. д. Так что не ждите слишком точного расчета
см. мое обновление выше
«Иногда операция поиска зависает при выполнении запроса к базе данных Монго. И это зависание может длиться до 2 часов и более». - Звучит... плохо. Вы тоже изучаете, что является причиной этого? Принудительный тайм-аут операции, вероятно, будет полезным решением, но меня определенно будет беспокоить, что вообще вызывает такое поведение.