草庐IT

node.js - Multi-Tenancy MongoDB + mongo-native 驱动 + 连接池

coder 2023-11-05 原文

我们正在尝试使用 nodejs/mongo-native 驱动程序实现以下演示文稿(幻灯片 13-18)中概述的策略。

https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application

总结:

  • 从 node.js 创建到 mongodb 的连接池。
  • 对于租户的每个请求,从池中获取一个连接并“验证”它。使用经过身份验证的连接来处理请求。响应后,将连接返回到池中。

我能够像这样使用 mongo-native 驱动程序创建到 mongodb 的连接池,而无需指定任何数据库:

const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, poolSize: 10 });

但是,为了得到一个数据库对象,我需要做以下事情:

const db = client.db(dbName);

这是我想验证连接的地方,AFAICS,此功能已从更新的 mongo 驱动程序、node.js 和 java 中弃用/删除。

从演示文稿来看,这似乎适用于旧版本的 Java 驱动程序。

我什至可以使用单个连接池并使用相同的连接向各个数据库验证租户吗?

我们的替代方案是每个租户都有一个连接池,目前这对我们没有吸引力。

我们将不胜感激任何帮助,包括弃用/删除此功能的原因。

最佳答案

幻灯片上的是我!! :) 我记得那次 session ,很有趣。

是的,这不再有效了,他们在我们实现它后大约 6 个月就取消了这个宏伟的功能,当时我们在 Beta 版中就没有了。我们必须改变我们的工作方式..

遗憾的是,直到今天,在 Mongo 中,“连接”(网络内容、SSL、集群标识)和身份验证是 2 个独立的操作。 想想当你运行 mongo shell 时,你提供了主机、端口、副本集(如果有的话),以及你的 in,已连接!但未经认证。然后,您可以对 user1 进行身份验证,执行操作,然后对 user2 进行身份验证,并执行只有 user2 可以执行的操作。这是在同一个连接上完成的!无需通过开销再次创建 channel 、SSL 握手等...

那时,驱动程序让我们有一个“空白”连接的连接池,我们可以在当前执行线程的上下文中随意向当前租户进行身份验证。

然后他们弃用了这个功能,我认为是在 Mongo 2.4 中。现在他们只支持在创建时经过身份验证的连接。我们询问了企业支持,他们没有说明原因,但在我看来,他们发现这种方式并不安全,“旧”身份验证可能会泄漏,并停留在“不那么空白”的可重用连接上。

我们对我们的 Multi-Tenancy 基础设施实现进行了更改,从一个大的空白连接池到许多(小)经过身份验证的连接池,每个租户一个池。每个租户的这些池可能非常小,例如 3 或 5 个连接。这个解决方案很好地扩展到数百个租户,但为了满足数千个租户,我们必须进行各种优化以根据需要创建池、在空闲时间后关闭它们、为非事件或休眠租户延迟创建等。这允许我们要扩大规模...我们仍在研究解决方案和优化。

您始终可以返回到一个全局的经过身份验证的连接池,连接到有权访问多个数据库的 Mongo 用户。是的,您可以在同一个经过身份验证的连接上切换数据库。你只是不能切换身份验证.. 这是一个纯 Mongo Java 驱动程序的示例,我们使用了提供类似功能的 Spring:

MongoClient mongoClient = new MongoClient();
DB cust1db = mongoClient.getDB("cust1");
cust1db.get...
DB cust2db = mongoClient.getDB("cust2");
cust2db.get...

有些相关,我建议查看静态 MongoDB 加密,这是一项企业功能。根据不同的 key 加密每个数据库(每个客户)的唯一方法。

关于node.js - Multi-Tenancy MongoDB + mongo-native 驱动 + 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345147/

有关node.js - Multi-Tenancy MongoDB + mongo-native 驱动 + 连接池的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  3. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  9. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  10. ruby - Ruby 1.9.1 中的 native 线程,对我有什么好处? - 2

    所以,Ruby1.9.1现在是declaredstable.Rails应该与它一起工作,并且正在慢慢地将gem移植到它。它具有native线程和全局解释器锁(GIL)。自从GIL到位后,原生线程是否比1.9.1中的绿色线程有任何优势? 最佳答案 1.9中的线程是原生的,但它们被“放慢了速度”,一次只允许一个线程运行。这是因为如果线程真的并行运行,它会混淆现有代码。优点:IO现在在线程中是异步的。如果一个线程阻塞在IO上,那么另一个线程将继续执行直到IO完成。C扩展可以使用真正的线程。缺点:任何非线程安全的C扩展都可能存在使用Thre

随机推荐