У меня есть приложение, которое может работать как однопоточное, так и кластерное, не имеет значения;который должен подключаться к двум отдельным серверам MongoDB, которые доступны через два разных URL-адреса.
Для пояснения, так как большинство популярных поисков по этим основным моментам подключаются к ДВУМ базам данных, НЕ СЕРВЕРАМ: мне нужно подключиться к ДВУМ различным ХОСТАМ;т.е.: mongodb + srv: // u: p@host1.com И mongodb + srv: // u: p@host2.com.
Текущая проблема, с которой я сталкиваюсь, - это инициализация моих клиентов подключения.Базовая логика предполагает, что следующее будет работать как задумано (то есть: использование clienthost1 вернет данные с сервера host1 и т. Д.)
let Mongo = require('mongodb'), MongoClient = Mongo.MongoClient
let ClientHost1 = await MongoClient.connect(url1, options1); //returns access to dataset1 from server on host1
let ClientHost2 = await MongoClient.connect(url2, options2); //returns access to dataset2 from server on host2
Однако, как только вы запустите это во время запуска сценария и запустите простойAPI-вызов к конечной точке, которая использует ClientHost1, я получаю ошибку «нет такой коллекции».При погружении в ошибку я обнаружил, что ClientHost1 только возвращал результаты запроса из набора данных ClientHost2.Об этом свидетельствует запуск списка listDatabase на ClientHost1, который возвращает имена БД для ClientHost2.
Итак, соединение ClientHost1 было по существу передано более недавно установленному соединению ClientHost2.
Поэтому ямне интересно, есть ли способ предотвратить эту замену соединения?
Для ясности, я не пытаюсь подключиться к репликационному набору или двум БД в одном экземпляре базы данных MongoDB.Я понимаю, что немедленное решение этой проблемы заключается в том, чтобы поместить оба набора данных в один и тот же экземпляр сервера базы данных, однако это не идеально, поскольку один экземпляр предназначен для быстрого запроса учетных записей, а другой - для операций с учетными записями, таких как транзакции.
Структура выглядит следующим образом:
хост 1, БД, такие как учетные записи (коллекция: пользователи, продавцы), кошельки, товары и т. Д.
хост 2: 1 БД для каждой учетной записив БД «Аккаунты» хоста 1.
Значение в математических терминах для n документов в account.users host1 => n DB в хосте 2.
Причина, по которой я ищу возможность подключения к двум экземплярам изодин процесс:
Если бы я вставил host1 и host2 в один и тот же экземпляр, простой запрос учетных записей пользователей стал бы интенсивным в масштабе, особенно для сложных запросов транзакций в наборе данных2, что довольно часто встречается в транзакциях.связанные платформы.Разделение набора данных на два разных экземпляра позволяет быстро обрабатывать запросы учетных записей и переносить пакетную обработку / анализ транзакций на более интенсивные и, возможно, более дорогие машины.Кроме того, поскольку последнее может увеличить вероятность сбоев для любых машин, на которых размещен набор данных2, совместное их использование повышает вероятность сбоев на уровне платформы.
Я понимаю, что простой обходной путь - запуск приложения в постоянном количестве кластерных процессов с PM2 или модулем кластера, при этом основной процесс API предназначен для запроса вторичного (не общедоступного)процесс) через http на локальном хосте.Хотя это хорошо, и я, вероятно, собираюсь использовать этот подход, он действительно вводит проблему межпотоковых коммуникаций во всем миксе.
Любые предложения или идеи будут высоко оценены по этому вопросу.PS: ЭТО НЕ РАБОТАЕТ С MONGOOSE ...