go - 管理 Multi-Tenancy ArangoDB 连接

标签 go arangodb

我使用 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. 终止其中一个池连接(如果未使用)
  2. 等待 #1 完成,如果等待时间太长,则抛出错误。

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

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

最佳答案

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

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

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

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

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

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

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

相关文章:

go - 你如何计算 Go 中 Big Int 的平方根?

MongoDB + Neo4J vs OrientDB vs ArangoDB

python - 如何将 ArangoDB 与灯泡和 rexster 一起使用?

browser - arangodb 服务器连接被拒绝

arangodb - 使用 Edge 进行范围查询

当状态为 301 且没有 Location header 时,HTTP 客户端不会返回响应

gorm golang one2many 同一张表

graph - 如何按传入边数进行计数和排序

go - 使用go-tdlib停留在“authorizationsStateWaitPhoneNumber”状态

pointers - 指针的 slice ,当传递给对象时,得到具有其他地址的指针