【问题标题】:Manage multi-tenancy ArangoDB connection管理多租户 ArangoDB 连接
【发布时间】:2018-01-09 17:51:16
【问题描述】:

我使用 ArangoDB/Go(使用 go-driver)并且需要实现多租户,这意味着每个客户都将在单独的数据库中拥有他的数据。

我想弄清楚的是如何使这种多租户工作。我知道为每个请求创建一个新的数据库连接是不可持续的,这意味着我必须维护一个连接池(不是典型的连接池)。当然,我不能只是假设我可以无限,必须有一个限制。然而,我想得越多,我就越明白我需要一些建议。我是 Go 新手,来自 PHP 世界,显然它是 PHP 中完全不同的范式。

一些细节 我有一个使用 arangodb/go-driver 与 ArangoDb 对话的 API(用 Go 编写)。创建数据库连接的标准方法是

  • 创建连接 conn, err := graphHTTP.NewConnection(...)

  • 创建客户端 c, err := graphDriver.NewClient(...)

  • 创建数据库连接 graphDB,错误:= p.cl.Database(...)

如果只有一个 DB,并且在 API 启动时创建 DB 连接,则此方法有效。 就我而言,它有很多,而且如前所述,我需要维护一个数据库连接池。

让我感到困惑的是如何维护这个游泳池,请记住,游泳池必须有一个限制。 比如说,我的池大小为 5,随着时间的推移,它已被连接填满。一个新请求进来,它需要连接到不在池中的数据库。 在我看来,我只有两个选择:

  1. 如果未使用其中一个池连接,则终止它
  2. 等到 #1 可以完成,如果等待时间太长,则抛出错误。

最大的未知,这主要是因为我从来没有做过这样的事情,对我来说是如何跟踪连接是否正在使用。 更复杂的是,数据库连接有自己的池,它是在传输级别完成的。

关于如何完成这项任务的任何建议?

【问题讨论】:

  • 如果您的问题是关于 ArangoDB 中多租户的可扩展性,那与 Go 或 PHP 无关。
  • @Adrian,我要求验证我对多租户数据库连接管理的想法。此外,很高兴看到一些关于如何做到这一点的建议,或者如何不......
  • 这仍然与 Go 或 PHP 无关。正如所写,这个问题是如此模糊以至于无法回答。是的,你会想要使用某种连接池;不,你不能打开无限连接。很难给出任何建议或说出您是否“在思考正确的方向”,因为除了某种有限连接池之外,没有提供关于您实际尝试完成的任务或您正在考虑的方向的真正细节。
  • 好吧,我听到了@Adrian,让我试着完善我的解释,一旦对你有意义,我会更新我的原始问题。
  • @Adrian,现在更有意义了吗?

标签: go arangodb


【解决方案1】:

几个月前,我在一个 Java 概念验证 SaaS 应用程序中实现了这一点。

我的方法可以概括为:

  1. 创建一个并发队列来保存 Java 驱动程序实例(Java 驱动程序内置了连接池)
  2. 使用子域来确定正在使用哪个 SaaS 客户端(可以使用 URL 参数,但我不喜欢这种方法)
  3. 从基于 SaaS 客户端的队列中引用正确的连接,如果不在队列中,则创建一个新连接。
  4. 继续请求。

通过命名每个 DB 以匹配子域,这相当简单,但也可以使用 _systemdb 的查找。

*编辑 并发队列每个数据库最多保存一个 Driver 对象,因此大小最多将匹配数据库的数量。在我的测试中,我根本没有管理这个队列的大小。

一个好的服务器应该能够容纳数百甚至数千个,具体取决于内存,如果扩展足够大,可以使用负载平衡策略将客户端拆分为不同的服务器集群。工作线程也可用于根据年龄删除对象,但这可能会干扰吞吐量。

【讨论】:

  • @ivannaumenko 队列每个数据库最多有一个对象。数据库连接池通过驱动管理github.com/arangodb/arangodb-java-driver/blob/master/…
  • 我明白,您说的是“创建一个并发队列来保存 Java 驱动程序实例”,对吧?就像你说的那样,队列每个数据库最多有一个对象。如果您有数百个 DB,您是否要将它们全部保留在队列中,并且对大小没有限制?如果没有,并且 Queue 确实有大小,则需要对其进行管理。这就是我问的。
  • @IvanNaumenko 希望我的编辑能更好地回答这个问题。理想情况下,队列没有大小限制,但这当然取决于服务器资源。
  • 这完全有道理,这正是我的实现方式。
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
相关资源
最近更新 更多