【问题标题】:Most appropriate web framework for multi-tenant / multi-template SAAS application最适合多租户/多模板 SAAS 应用程序的 Web 框架
【发布时间】:2011-05-19 19:14:51
【问题描述】:

我正在构建一个新的 SAAS 应用程序,并正在寻找有关最合适的框架的建议。我意识到没有一个框架可能能够完成所有这些工作,但我想我会询问社区并尝试找到一个可以解决最困难问题的框架。

要求

  1. 单一代码源。 (每个客户都有一个子域或不同的域,但每个人都应该使用相同的代码库和相同的服务器)
  2. 应该能够更新一次编程源并让所有租户都使用它
  3. 会话信息应保存在缓存存储中,或仅保存在 cookie 中(无共享状态)
  4. 内置多租户数据库功能。(根据用于访问应用程序的域,框架应自动使用分配给该域的数据库连接信息)
  5. 每个客户/域可能有自己的网页模板。模板需要根据每个客户进行分配,并保留在应用程序代码之外
  6. 安全性和快速原型设计比速度更重要
  7. 会有很多 CRUD 类型的屏幕,因此需要简单的内置功能

我有相当长的 Java 和 PHP 经验,但我只考虑 PHP 作为最后的手段。我的 Scala、Python 和 Ruby 体验有点生疏,但如果它们提供显着优势,我不介意加快速度。我看过剧!框架和喜欢它(很好地满足#1、#2、#6),但多租户方面不是很强大。我已经使用 Grails 完成了几个项目,它可以处理除了 #3 和 #5 之外的所有内容,并且可以被黑客入侵来完成其余的工作。

【问题讨论】:

  • 我不确定我是否正确理解了#3。 javax.servlet.http.HttpSession 有什么问题?

标签: grails playframework saas web-frameworks multi-tenant


【解决方案1】:

我想说第三点是相当独立于 grails/play/whatever 一般的。如果您需要共享缓存,则有许多提供者,并且 Grails 中的大多数提供者都有插件。

grails 中的多租户非常成熟,并且比 Sebastiens 回答中的博文中的解决方案更具侵入性。无论您是使用单租户(多个数据库)还是多租户,对您的代码来说或多或少都是透明的,并且大部分令人头疼的问题都被抽象掉了。请注意,您需要进行一些智能索引(例如在多列索引中包含租户 ID 等),以免在数据开始增长时出现非常糟糕的速度。

对于外部化视图,您可以将它们放在数据库中,也可以将它们符号链接到您的 web 应用程序中,然后将它们保存在单独的编号文件夹中。然后从租户插件中,您可以使用TenantUtils.getCurrentTenant() 并简单地从相应的文件夹"/" + (tenantID ?: "default") + "/whatever/view/path" 进行渲染。这样,如果您愿意,可以在租户之间共享布局等,您只需将租户特定的东西放在租户特定的文件夹中。

您也可以在游戏中执行此操作,或者,但我看不出有什么阻碍您在 Grails 中执行此操作。

我在这个问题上的 0.02 美元。

【讨论】:

    【解决方案2】:

    真的玩!非常适合您的需求。

    阅读这篇文章: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

    效果很好。你甚至可以让这个过滤器工作,这样你就可以向客户公开 crud 模块,他们只会得到他们自己的数据......

    对于非常大的应用程序,分片似乎尚不支持(我认为尚未处理任何休眠分片)。 有一个 multidb 插件可以与多个 db 一起使用,但它似乎还不能很好地工作......

    【讨论】:

    • 感谢您的链接!正是我一直在寻找的。​​span>
    【解决方案3】:

    我听说 Grails 的Multi-Tenant plugin 为几种不同的多租户方法提供了一些很好的工具。

    “每个客户/域可能有自己的网页模板。 模板需要在每个客户的基础上分配并保存 在应用程序代码之外”

    我假设您的意思是他们每个人都有自己的布局/皮肤。有几种技术可以执行此操作:

    • 您可以根据租户手动分配layouts<meta name="layout" content="${tenantName}/main" />

    • 编写您自己的可感知租户的 LayoutDecoratorMapper 并覆盖 sitemesh.xml 中的默认 GrailsLayoutDecoratorMapper

    • 弄清楚如何覆盖和增强一些内部工具动态解析视图(每个租户)或资源(GrailsViewResolver、GrailsConventionGroovyPageLocator、GrailsResourceLoader 等)

    【讨论】:

      【解决方案4】:

      在 PHP 中,您可以使用 Innomatic Platform 构建多租户(隔离数据库)应用程序: http://www.innomatic.org

      【讨论】:

      • 我认为它不再被开发
      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 2013-07-07
      • 2014-07-27
      • 2017-01-07
      • 2020-08-01
      • 2023-01-28
      • 2012-05-17
      • 2012-04-10
      相关资源
      最近更新 更多