我有一个可以运行单线程或集群的应用程序,没关系;它需要连接到两个单独的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
但是,一旦在启动脚本中运行此脚本,并对使用ClientHost1的端点运行简单的api调用,我将收到“无此收集”错误。 当深入研究错误时,我发现ClientHost1仅从ClientHost2的数据集中返回查询结果。通过在ClientHost1上运行“ listDatabases”来证明,该数据库返回了ClientHost2的数据库名称。
因此,ClientHost1的连接实质上已传递到ClientHost2的较新建立的连接。
因此,我想知道是否有办法防止这种连接替换发生?
为了清楚起见,我没有尝试连接到副本集或单个MongoDB数据库实例上的两个数据库。我意识到,解决该问题的直接方法是将两个数据集都放在同一个数据库服务器实例中,但这并不理想,因为一个实例用于快速查询帐户,而另一个实例用于帐户活动(例如交易)。>
结构如下:
主机1,数据库,例如帐户(集合:用户,商人),钱包,物品等。
host2:host1的“帐户”数据库中每个帐户1个数据库。
数学上的含义,对于account中的n个文档。host1的用户=> host 2中的n个DB。
我希望能够从一个进程连接到两个实例的原因:
如果我将host1和host2放在同一实例上,那么简单地查询用户帐户就会变得很麻烦,尤其是对于数据集2上的事务的复杂查询,这在与事务相关的平台中相当普遍。 将数据集分为两个不同的实例可以使帐户查询迅速进行,并将事务批处理/分析的工作分摊到更密集,甚至更昂贵的计算机上。此外,由于后者可能会增加托管数据集2的任何计算机的中断机会,因此将它们一起使用会增加整个平台范围内中断的机会。
我意识到一个简单的解决方法是使用PM2或集群模块在一对永久的集群进程中运行该应用程序,而主要的api进程旨在通过以下方式查询辅助(非公开访问的进程)本地主机上的http。尽管这很好,而且我很可能会采用这种方法,但确实将跨线程通信的问题引入了整个组合。
对此事,任何建议或见解将不胜感激。 PS:这不适用于猫鼬...