【发布时间】:2013-05-19 05:36:08
【问题描述】:
我正在寻找其他尝试使用数据库级隔离构建多租户 Django 应用程序的工作代码和想法。
更新/解决方案:我在一个新的开源项目中解决了这个问题:见django-db-multitenant
目标
我的目标是根据请求主机名或请求路径(例如,foo.example.com/ 将 Django 连接设置为使用数据库 foo , 而bar.example.com/ 使用数据库bar)。
先例
我知道一些现有的 Django 多租户解决方案:
-
django-tenant-schemas:这非常接近我想要的:你以最高优先级安装它的中间件,它会向数据库发送一个
SET search_path命令。不幸的是,它是 Postgres 特有的,我被 MySQL 困住了。 -
django-simple-multitenant:这里的策略是为所有模型添加一个“租户”外键,并调整所有应用程序业务逻辑以关闭它。基本上每一行都被
(id, tenant_id)而不是(id)索引。我尝试过但不喜欢这种方法,原因有很多:它使应用程序更加复杂,可能导致难以发现的错误,而且它不提供数据库级别的隔离。 - 每个租户一个 {app server, django settings file with appropriate db}。又名穷人的多租户(实际上是富人的,考虑到它所涉及的资源)。我不想为每个租户启动一个新的应用服务器,为了可扩展性,我希望任何应用服务器都能够为任何客户端分派请求。
想法
到目前为止,我最好的想法是做类似django-tenant-schemas 的事情:在第一个中间件中,抓住django.db.connection 并摆弄数据库选择而不是架构。我还没有完全考虑到这对于池/持久连接意味着什么
我追求的另一个死胡同是特定于租户的表前缀:除了我需要它们是动态的之外,即使是全局表前缀在 Django 中也不容易实现(请参阅rejected ticket 5000 等)。
最后,Django multiple database support 允许您定义多个命名数据库,并根据实例类型和读/写模式在它们之间多路复用。没有帮助,因为没有工具可以根据每个请求选择数据库。
问题
有人做过类似的事情吗?如果有,您是如何实现的?
【问题讨论】:
-
正如最初写的那样,它不适合 Stack Overflow。我已经删除了令人震惊的部分。
-
感谢您添加赏金。
-
关于“令人震惊”的部分:没有问题,尽管我仍然对我所要求的“令人沮丧”的建议感兴趣,即使本质上是轶事,因为 IMO 这是一个设计/架构问题:处理多租户应用程序设计有多种根本不同的方法,因此第一手经验对于衡量可能不会立即显而易见的设计权衡很有价值。这是一个对 HN 有所帮助的讨论:news.ycombinator.com/item?id=4270003
-
这样的讨论不适合 Stack Overflow。因此我把它们删掉了。
-
这可能不是特定于您的情况,但您确实应该再次考虑最后一个选项。我在一家大型金融机构工作,当我们评估供应商时,应用程序层的共享内存空间对我们来说是一个巨大的问题。我理解您对可扩展性的担忧,但如果您使用 Puppet 或 Chef 之类的东西,您可以自动执行这些部署,只需向您的第一层 Web 服务器添加一个条目。由于内存和计算现在如此便宜,额外 Django 实例的少量额外资源对成本的影响最小。
标签: mysql django multi-tenant