gpt4 book ai didi

go - 管理 Multi-Tenancy ArangoDB 连接

转载 作者:IT王子 更新时间:2023-10-29 01:41:10 28 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

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

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

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

最佳答案

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

我的方法可以概括地描述为:

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

通过命名每个数据库以匹配子域,这是相当简单的,但也可以使用从 _systemdb 进行的查找。

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

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

关于go - 管理 Multi-Tenancy ArangoDB 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174019/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com