Просматривая эту официальную документацию Кажется, что драйвер MongoDB C # выдает в основном три типа ошибок:
- ошибки, возникающие, когда драйвер не может правильно выбрать или подключиться к серверу, чтобы отправить запрос. Эти ошибки приводят к
TimeoutException
- ошибки, возникающие, когда драйвер успешно выбрал сервер для выполнения запроса, но сервер отключается во время выполнения запроса. Эти ошибки проявляются как
MongoConnectionException
- ошибки, возникающие во время операций записи. Эти ошибки приводят к
MongoWriteException
илиMongoBulkWriteException
в зависимости от типа выполняемой операции записи.
Я пытаюсь сделать свое программное обеспечение, использующее MongoDB, более устойчивым к временным ошибкам, поэтому я хочу найти, какие исключения стоит повторить.
Проблема не в реализации надежной политики повторных попыток (обычно я использую Polly .NET для этого), но вместо этого понимая, когда повторная попытка имеет смысл.
Я думаю, что повторная попытка при исключениях типа TimeoutException
не имеет смысла, потому что сам драйвер ждет несколько секунд, прежде чем тайм-аут операции (по умолчанию 30 секунд, но вы можете изменить это с помощью параметров строки подключения). Идея состоит в том, что повторение операции после того, как вы подождали 30 секунд до истечения времени ожидания, вероятно, является пустой тратой времени. Например, если вы решите реализовать 3 повтора с интервалом ожидания в 1 секунду, то для сбоя операции потребуется до 93 секунд (30 + 30 + 30 + 1 + 1 + 1). Это огромное время.
Как описано здесь повторная попытка на MongoConnectionException
безопасна только при выполнении идемпотентных операций. С моей точки зрения, имеет смысл всегда повторять попытки исправить подобные ошибки при условии, что выполняемая операция идемпотентна.
Сложным моментом в выборе хорошей стратегии повтора для записи является случай, когда вы получаете исключение типа MongoWriteException
или MongoBulkWriteException
.
Что касается исключений типа MongoWriteException
, вероятно, стоит повторить попытку всех исключений, имеющих ServerErrorCategory
отличный от DuplicateKey
. Как здесь вы можете обнаруживать повторяющиеся ключевые ошибки с помощью этого свойства объекта MongoWriteException.WriteError
.
Повторная попытка повторяющихся ключевых ошибок, вероятно, не имеет смысла, потому что вы получите их снова (это не временная ошибка).
Я понятия не имею, как безопасно обрабатывать ошибки типа MongoBulkWriteException
. В этом случае вы вставляете несколько документов в MongoDB, и вполне возможно, что только некоторые из них вышли из строя, в то время как другие были успешно записаны в MongoDB. Таким образом, повторная попытка одной и той же операции массовой вставки может привести к двойной записи одного и того же документа (массовая запись не идемпотентна по своей природе). Как я могу справиться с этим сценарием?
Есть ли у вас предложения ?
Знаете ли вы какой-либо рабочий пример или ссылку относительно повторных запросов в MongoDB для драйвера C #?