我使用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,随着时间的推移,它已被填满了连接。有一个新请求,它需要连接到不在池中的数据库。 我看到它的方式,我只有两个选择:
最大的未知,这主要是因为我从来没有做过这样的事情,因为我是如何跟踪连接是否被使用。 让事情变得更复杂的是,数据库连接拥有它自己的池,它在传输层面完成。
有关如何处理此任务的任何建议?
答案 0 :(得分:2)
几个月前,我在Java概念证明SaaS应用程序中实现了这一点。
我的方法可以在高级别描述为:
通过命名每个数据库以匹配子域,这是相当简单的,但也可以使用来自_systemdb的查找。
*编辑 并发队列每个数据库最多保存一个Driver对象,因此最多大小将与数据库的数量相匹配。在我的测试中,我根本没有管理这个队列的大小。
一台好的服务器应该能够容纳数百甚至数千个,具体取决于内存,如果扩展得足够大,可以使用负载平衡策略将客户端分成不同的服务器集群。工作线程也可用于根据年龄删除对象,但可能会影响吞吐量。