我使用 ArangoDB/Go(使用 go-driver)并且需要实现 Multi-Tenancy ,这意味着每个客户都将在单独的数据库中拥有他的数据。
我想要弄清楚的是如何使这种 Multi-Tenancy 工作。我知道为每个请求创建一个新的数据库连接是不可持续的,这意味着我必须维护一个连接池(不是典型的连接池)。当然,我不能假设我可以创造无限,必须有一个限度。然而,我想得越多,我就越明白我需要一些建议。我是 Go 的新手,来自 PHP 世界,显然这是 PHP 中完全不同的范例。
一些细节 我有一个 API(用 Go 编写),它使用 arangodb/go-driver 与 ArangoDb 进行通信。创建数据库连接的标准方法是
创建连接 conn, err := graphHTTP.NewConnection(...)
创建客户端 c, err := graphDriver.NewClient(...)
创建数据库连接 graphDB, err := p.cl.Database(...)
如果只有一个数据库,并且数据库连接是在 API 启动时创建的,则此方法有效。 就我而言,它有很多,而且,正如前面所建议的,我需要维护一个数据库连接池。
让我感到模糊的是如何维护这个池,请记住池必须有一个限制。 假设我的池大小为 5,随着时间的推移,它已经被连接填满了。一个新请求进来,它需要连接到不在池中的数据库。 在我看来,我只有两个选择:
- 终止其中一个池连接(如果未使用)
- 等待 #1 完成,如果等待时间太长,则抛出错误。
最大的未知,这主要是因为我从来没有做过这样的事情,对我来说是如何跟踪连接是否正在使用。 让事情变得更加复杂的是数据库连接有它自己的池,它是在传输级别完成的。
关于如何完成这项任务有什么建议吗?
最佳答案
几个月前,我在 Java 概念验证 SaaS 应用程序中实现了这一点。
我的方法可以概括地描述为:
- 创建一个并发队列来保存 Java 驱动程序实例(Java 驱动程序内置有连接池)
- 使用子域来确定正在使用哪个 SaaS 客户端(可以使用 URL 参数,但我不喜欢这种方法)
- 根据 SaaS 客户端引用队列中的正确连接,如果队列中没有,则创建一个新连接。
- 继续处理请求。
通过命名每个数据库来匹配子域,这是相当简单的,但也可以使用 _systemdb 的查找。
*编辑 并发队列每个数据库最多保存一个驱动程序对象,因此其大小最多与数据库的数量相匹配。在我的测试中,我根本没有管理这个队列的大小。
一个好的服务器应该能够容纳数百个甚至数千个,具体取决于内存,并且如果扩展足够大,可以使用负载平衡策略将客户端拆分到不同的服务器集群中。工作线程也可用于根据年龄删除对象,但这可能会干扰吞吐量。
关于go - 管理 Multi-Tenancy ArangoDB 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174019/