По поводу того, как подключить сервис node.js к MongoDB, я просмотрел множество материалов на китайском и английском языках и обнаружил, что нет решения, очень подходящего для моих ожидаемых возможностей, поэтому, после некоторых исследований официальных документов, я резюмировал следующие методы подключения к MongoDB (с использованием в настоящее время наиболее часто используемого мангуста MongoDB ODM на платформе Node.js), смело названные «лучшими практиками», я надеюсь, что смогу получить больше профессиональных ответов от всех. Без лишних слов, давайте начнем с кода:
const mongoose = require('mongoose')
const config = require('./config')
if (process.env.NODE_ENV === 'development') {
mongoose.set('debug', true) /* A */
}
mongoose.set('bufferCommands', false) /* B */
function connectMongoDB(address) {
try {
mongoose.connect(address, {
useNewUrlParser: true,
bufferMaxEntries: 0 /* B */
autoReconnect: true /* C, default is true, you can ignore it */
poolSize: 5 /* D, default is 5, you can ignore it */
})
const db = mongoose.connection
db.on('error', (error) => {
console.log(`MongoDB connecting failed: ${error}`)
})
db.once('open', () => {
console.log('MongoDB connecting succeeded')
})
return db
} catch (error) {
console.log(`MongoDB connecting failed: ${error}`)
}
}
const mongoInstance = connectMongoDB(config.database.mongo)
module.exports = {
mongoInstance
}
Этот метод подключения может соответствовать следующим требованиям, конечно, это также резюмируется из требований, которым должен соответствовать мой сервис:
- Среда разработки может печатать подробную информацию о работе с базой данных.
- После отключения от базы данных все команды, связанные с операциями чтения и записи базы данных, немедленно возвращают ошибку, вместо того, чтобы ждать повторного подключения, чтобы вызвать тайм-аут интерфейса.
- После того, как служба запустится и успешно установит соединение с базой данных, если возникнет проблема с базой данных и соединение будет прервано, служба автоматически попытается переподключиться до тех пор, пока соединение не будет установлено успешно.
- Нет необходимости вручную обрабатывать количество подключений
Давайте рассмотрим конфигурацию, соответствующую каждому требованию, по порядку:
- См. примечание А. Установите для параметра «отладка» значение true в среде разработки, база данных выведет метод и параметры сбора на консоль.
- Смотрите два заметки B, вот абзац документа мангуста на
bufferMaxEntries
Объяснение:
bufferMaxEntries - The MongoDB driver also has its own buffering mechanism that kicks in when the driver is disconnected. Set this option to 0 and set bufferCommands to false on your schemas if you want your database operations to fail immediately when the driver is not connected, as opposed to waiting for reconnection.
Основной смысл в том, чтобыbufferMaxEntries
установить на 0 иbufferCommands
Установите значение false, чтобы драйвер немедленно завершил операцию, когда он не подключен к базе данных, вместо ожидания повторного подключения. Лично этот метод лучше, чем ожидание повторного подключения базы данных до истечения времени ожидания ответа.
- См. примечание C, на самом деле это настройка мангуста по умолчанию, параметр конфигурации autoReconnect при подключении к базе данных по умолчанию имеет значение true, и его значение указано в документации:
autoReconnect - The underlying MongoDB driver will automatically try to reconnect when it loses connection to MongoDB. Unless you are an extremely advanced user that wants to manage their own connection pool, do not set this option to false.
Если вы не являетесь опытным пользователем, не изменяйте этот параметр.
- См. примечание D. Что касается проблемы с пулом соединений MongoDB, рекомендуется не решать ее вручную. Сам Mongoose поддерживает пул соединений с максимальным размером по умолчанию 5. Вам следует рассмотреть возможность увеличения poolSize, только если вы обнаружите, что некоторые медленные запросы могут блокировать быстрые запросы. Конечно, это число не может быть слишком большим.По умолчанию MongoDB запускает один поток для обслуживания одного соединения.Если соединений слишком много, системные накладные расходы на переключение количества потоков будут очень большими.
Конечно, у приведенного выше набора «лучших практик» все же есть недостаток: если службе не удается подключиться к базе данных после первоначального запуска (например, база данных в это время не работает), служба не будет пытаться повторно подключиться к базе данных. базу данных. Решения нет, но оно довольно безвкусно: попробуйте переподключиться в функции обратного вызова прослушивателя событий «ошибка» соединения мангуста. Но нужно выставить максимальное количество повторов, иначе произойдет утечка памяти. Причина, по которой это более безвкусно, заключается в том, что если первое соединение не удалось, попытки повторного подключения несколько раз за короткий промежуток времени кажутся бесполезными. Поэтому при использовании этого метода подключения убедитесь, что база данных находится в состоянии подключения. Или, если у читателей есть лучшее решение, я надеюсь, что они смогут просветить меня.
над.
Эта статья была впервые опубликована в моем блоге (Нажмите здесь, чтобы просмотреть), добро пожаловать, чтобы следовать.