管理多租户ArangoDB连接

时间:2018-01-09 17:51:16

标签: go arangodb

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

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

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

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

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

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

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

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

  1. 如果没有使用
  2. ,请杀死其中一个池状连接
  3. 等到#1可以完成,或者如果等待时间太长则抛出错误。
  4. 最大的未知,这主要是因为我从来没有做过这样的事情,因为我是如何跟踪连接是否被使用。 让事情变得更复杂的是,数据库连接拥有它自己的池,它在传输层面完成。

    有关如何处理此任务的任何建议?

1 个答案:

答案 0 :(得分:2)

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

我的方法可以在高级别描述为:

  1. 创建并发队列以保存Java驱动程序实例(Java驱动程序具有连接池构建)
  2. 使用子域名来确定正在使用哪个SaaS客户端(可以使用URL参数,但我不喜欢这种方法)
  3. 基于SaaS客户端从队列引用正确的连接,或者如果不在队列中,则创建一个新连接。
  4. 继续请求。
  5. 通过命名每个数据库以匹配子域,这是相当简单的,但也可以使用来自_systemdb的查找。

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

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