Ruby mon go драйвер: Ловить ошибки подключения MongoDB через несколько секунд? - PullRequest
0 голосов
/ 16 марта 2020

Я выполняю этот запрос с моим Ruby mongo драйвером:

begin
  User.collection.find({}).count()
rescue => e
  Rails.logger.error e.to_s
end

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

Например, иногда я вижу одну из ошибок:

Mongo::Error::NoServerAvailable (No server is available matching preference: #<Mongo::ServerSelector::Primary:0x70302744731080 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015)

Я хочу перехватывать ошибки уже через 6 секунд.

Из документов Я вижу, что есть несколько вариантов таймаута (connect_timeout, server_selection_timeout, socket_timeout). Но я не уверен, что проходить и как их проходить.

1 Ответ

0 голосов
/ 16 марта 2020

Вы на правильном пути. server_selection_timeout является правильным вариантом в этом случае - он сообщает водителю, как долго ждать, чтобы найти подходящий сервер, прежде чем истечет время ожидания. Вы можете установить эту опцию для нового клиента в файле конфигурации Mongoid (config/mongoid.yml).

Вы хотите, чтобы ваш файл конфигурации выглядел примерно так:

development: # (or production or whatever environment you're using)
  clients:
    default:
      # your default client here
    new_client: # the name of your new client with different options
      database: mongoid
      hosts:
        - localhost:27017
      options:
        server_selection_timeout: 6
        ...

Чтение Документация по конфигурации Mongoid , чтобы узнать больше о настройке файлов конфигурации.

Затем вы захотите использовать новый клиент, который вы определили для выполнения вашего запроса, и спасти любые ошибки Mongo::Error::NoServerAvailable.

begin
  User.with(client: 'new_client').collection.find({}).count()
rescue Mongo::Error::NoServerAvailable => e
  # perform error handling here
end

Обратите внимание, что при этом запускается новый экземпляр Mongo::Client, который является дорогостоящей операцией, если выполняется многократно. Я бы порекомендовал вам закрыть дополнительный клиент, как только вы закончите использовать его, например, так:

Mongoid::Clients.with_name('new_client').close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...