管理多租户ArangoDB连接

管理多租户ArangoDB连接,go,arangodb,Go,Arangodb,我使用ArangoDB/Go(使用Go驱动程序),需要实现多租户,这意味着每个客户都将在单独的数据库中拥有自己的数据 我想弄明白的是如何让这种多租户模式发挥作用。我理解为每个请求创建一个新的DB连接是不可持续的,这意味着我必须维护一个连接池(不是典型的连接池)。当然,我不能只是假设我可以做无限,必须有一个极限。然而,我想得越多,我就越明白我需要一些建议。我是新来的,来自PHP世界,显然这在PHP中是一个完全不同的范例 一些细节 我有一个API(用Go编写),它使用ArangoDb/Go驱动程序与

我使用ArangoDB/Go(使用Go驱动程序),需要实现多租户,这意味着每个客户都将在单独的数据库中拥有自己的数据

我想弄明白的是如何让这种多租户模式发挥作用。我理解为每个请求创建一个新的DB连接是不可持续的,这意味着我必须维护一个连接池(不是典型的连接池)。当然,我不能只是假设我可以做无限,必须有一个极限。然而,我想得越多,我就越明白我需要一些建议。我是新来的,来自PHP世界,显然这在PHP中是一个完全不同的范例

一些细节 我有一个API(用Go编写),它使用ArangoDb/Go驱动程序与ArangoDb对话。创建DB连接的标准方法是

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

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

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

如果一个人只有一个DB,并且DB连接是在API启动时创建的,那么这种方法就可以工作。 在我的例子中,它是很多的,并且,正如前面所建议的,我需要维护一个DB连接池

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

  • 如果池连接未使用,请将其杀死
  • 等到可以完成#1,或者如果等待时间太长,则抛出错误
  • 最大的未知数,这主要是因为我从未做过类似的事情,对我来说,是如何跟踪连接是否被使用。 更复杂的是,DB连接有自己的池,它是在传输级别上完成的


    关于如何完成这项任务有什么建议吗?

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

    我的方法可以在较高层次上描述为:

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

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


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

    如果你的问题是关于ArangoDB中多租户的可伸缩性,那与Go或PHP无关。@Adrian,我要求验证我对多租户数据库连接管理的想法。此外,如果能看到一些关于如何做到这一点或如何不做到这一点的建议,那将是非常棒的,因为这些建议仍然与Go或PHP无关。如文所述,这个问题是如此模糊,无法回答。是的,你需要使用某种连接池;不,您不能打开无限连接。很难给出任何建议,或者说你是否“朝着正确的方向思考”,因为除了某种有限的连接池之外,没有给出关于你真正想要完成什么或者你在想什么方向的真正细节。好吧,我听到了@Adrian,让我试着完善我的解释,一旦我的原始问题对你有意义,我会更新它。@Adrian,现在它更有意义了吗?@Ivanaumenko队列中每个数据库最多有一个对象。数据库连接池是通过驱动程序管理的,我知道,您说过“创建一个并发队列来保存Java驱动程序实例”,对吗?队列中每个数据库最多有一个对象,如您所说。如果你有数百分贝,你会把它们都放在队列中,而且队列的大小没有限制吗?如果不是,并且队列确实有大小,则需要对其进行管理。伊凡诺门科希望我的编辑能更好地回答这个问题。理想情况下,队列没有大小限制,但这当然取决于服务器资源。这完全有道理,这正是我实现的方式。