Как установить тайм-аут для поиска операции с Mongo в С#

Я использую nuget MongoDB.Driver Version=2.17.1.

Иногда операция поиска зависает при выполнении запроса к базе данных Монго. И это замирание может длиться до 2 часов и более.

Вот как я вызываю find:

Set<EntityDto>().Find(x => x.Id == id).FirstOrDefaultAsync(cancellationToken);

Я попытался найти какие-либо варианты установки тайм-аута и нашел:

  1. класс MongoClientSettings со многими свойствами, такими как ConnectTimeout, MaxConnectionIdleTime, MaxConnectionLifeTime, ServerSelectionTimeout, SocketTimeout
  2. класс FindOptions со свойствами MaxAwaitTime, MaxTime.

Но я не могу найти никакой документации, для чего служит каждое свойство. И не могу найти никаких значений по умолчанию, равных 2 часам.

Также я нашел здесь решение с cancelToken.

Но в любом случае я хотел бы узнать обо всех этих настройках в библиотеке Монго. Кто-нибудь знает, где найти объяснение или документацию?

«Иногда операция поиска зависает при выполнении запроса к базе данных Монго. И это зависание может длиться до 2 часов и более». - Звучит... плохо. Вы тоже изучаете, что является причиной этого? Принудительный тайм-аут операции, вероятно, будет полезным решением, но меня определенно будет беспокоить, что вообще вызывает такое поведение.

user20042973 14.06.2024 04:30

Я конечно смотрел мониторинг mongo db у облачного провайдера, но ничего интересного там не нашел

vitm 14.06.2024 08:39

какой именно мониторинг вам нужен? Для атласа вы можете использовать: mongodb.com/docs/atlas/monitoring-alerts . На стороне клиента вы можете настроить мониторинг следующим образом: stackoverflow.com/questions/78406949/… где вы можете собирать любые нужные вам метрики.

dododo 14.06.2024 08:52

Я имел в виду мониторинг нагрузки. Облачный провайдер дает это, но нагрузка кажется нормальной. Спасибо за ссылки!

vitm 18.06.2024 10:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подробности вы можете найти здесь. Опции в других драйверах и оболочках такие же, как и в драйвере 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);

vitm 18.06.2024 09:57

Для запроса на поиск 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 мс, все равно не прерывается, не знаю почему.

vitm 18.06.2024 10:00

Единственное решение, которое я нашел до сих пор, — это cancelationToken в коде C#.

vitm 18.06.2024 10:01

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

dododo 18.06.2024 11:26

см. мое обновление выше

dododo 18.06.2024 11:45

Другие вопросы по теме