标签: multi-tenant

为什么使用子域来指定多租户Web应用程序中的租户?

问题

  1. 为什么有些多租户Web应用程序使用子域来指定租户而其他人不使用?
  2. 是否存在技术,隐私或安全原因?
  3. 它是否依赖于用于开发Web应用程序的语言或框架?
  4. 这只是风格或开发人员的选择吗?

使用子域指定租户的示例Web应用程序

示例Web应用程序不使用子域来指定租户

subdomain multi-tenant

29
推荐指数
1
解决办法
7274
查看次数

PostgreSQL的多租户应用程序模式

我正在学习多租户应用程序以及PostgreSQL的模式如何用于此.

在研究这个主题时,我最终找到了一篇文章,其中作者描述了在多租户应用程序中使用PostgreSQL模式时的糟糕体验.主要问题是迁移性能不佳以及数据库资源的高使用率.

似乎只有一个模式(在租户之间共享表)会比每个租户有一个单独的模式更好的性能.但我觉得很奇怪.我认为相反,因为较小的表上的索引往往比较大的表上的索引更轻.

当数据在很多小表(在多个模式中)分离时,为什么性能会更差,而不是将数据分成几个巨大的表(在单个模式中)?

postgresql performance schema database-design multi-tenant

29
推荐指数
1
解决办法
8639
查看次数

基于Java(GWT,Spring,Hibernate)Web应用程序的SaaS /多租户方法

我目前正在考虑将使用Spring,GWT,Hibernate,Jackrabbit,Hibernate Search/Lucene(以及其他)的单租户基于Java的Web应用程序转换为完全成熟的SaaS风格应用程序.

我偶然发现了一篇文章,其中强调了以下7个"事物"作为对单个租户应用程序进行重要更改以使其成为SaaS应用程序:

  1. 该应用程序必须支持多租户.
  2. 该应用程序必须具有一定程度的自助注册.
  3. 必须有一个订阅/计费机制.
  4. 应用程序必须能够有效扩展.
  5. 必须具备监视,配置和管理应用程序和租户的功能.
  6. 必须有一种机制来支持唯一的用户识别和身份验证.
  7. 必须有一个机制来支持每个租户的某种程度的定制.

我的问题是,是否有人使用与我列出的类似技术在SaaS /多租户应用程序中实现上述任何7项内容?在我走上正在考虑的道路之前,我希望得到关于最佳方法的尽可能多的意见.

作为一个开始,我很确定我能够很好地处理如何在模型级别处理多个租户.我正在考虑为所有表添加租户ID,然后使用Hibernate过滤器(以及Hibernate Search的全文过滤器)根据登录用户的所有查询的租户ID进行过滤.

然而,我对性能也有一些担忧,特别是当我们的租户数量增长很多时.

任何有关如何实施此解决方案的建议都将受到高度赞赏(如果这个问题有点过于开放,我会道歉).

java saas multi-tenant hibernate-search

27
推荐指数
2
解决办法
7642
查看次数

使用Spring,Hibernate和C3P0管理多租户Web应用程序中的连接池

我正在尝试设置一个多租户Web应用程序,同时具有(理想情况下)数据库分离和模式分离方法的可能性.虽然我将从Schema分离开始.我们目前正在使用:

  • Spring 4.0.0
  • Hibernate 4.2.8
  • Hibernate-c3p0 4.2.8(使用c3p0-0.9.2.1)
  • 和PostgreSQL 9.3(我怀疑它对整体架构真的很重要)

大部分时间我都遵循这个主题(因为解决方案@Transactional).但我在执行方面有点迷失MultiTenantContextConnectionProvider.在这里也提到了类似的问题,但有些方面我无法弄清楚:

1)连接池会发生什么?我的意思是,它是由Spring还是Hibernate管理的?我猜ConnectionProviderBuilder- 或者按照建议 - 任何实现,Hibernate都是管理它的人.
2)Spring不管理连接池是一种好方法吗?或者Spring是否可以管理它?
3)这是未来实现数据库和模式分离的正确途径吗?

任何评论或描述都完全赞赏.

应用程序的context.xml

<beans>
    ...
    <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="c3p0DataSource" />
    </bean>

    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="org.postgresql.Driver" />
        ... other C3P0 related config
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="packagesToScan" value="com.webapp.domain.model" />

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.default_schema">public</prop>

                <prop key="hibernate.multiTenancy">SCHEMA</prop>
                <prop key="hibernate.tenant_identifier_resolver">com.webapp.persistence.utility.CurrentTenantContextIdentifierResolver</prop>
                <prop key="hibernate.multi_tenant_connection_provider">com.webapp.persistence.utility.MultiTenantContextConnectionProvider</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="autodetectDataSource" …
Run Code Online (Sandbox Code Playgroud)

postgresql spring hibernate c3p0 multi-tenant

27
推荐指数
1
解决办法
2万
查看次数

如何使用ASP.NET标识实现多租户用户登录

我正在开发一个多租户解决方案,我想使用最新的ASP.NET Identity框架,特别是Entity Framework实现.

基本上我需要允许两个用户拥有相同的用户名,虽然它必须在租户中是唯一的,我也想利用外部登录,如Twitter,微软,Facebook和谷歌.

据我所知,该框架并未考虑多租户设计,尽管它似乎确实允许可扩展性.我宁愿尽可能多地使用现有组件,但目前我认为我将不得不放弃实体框架实现,并自己编写代码.

有没有其他人试过这个,他们有多少自己编码.

multi-tenant entity-framework-6 asp.net-identity

25
推荐指数
1
解决办法
9824
查看次数

25
推荐指数
1
解决办法
5638
查看次数

多租户应用程序的输出缓存,因主机名和文化而异

我在ASP.NET MVC中有一个多租户应用程序.将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致).

应用程序的每个实例可能具有不同的文化设置(甚至"自动",以阅读浏览器的语言并尝试使用它),并将相应地进行本地化.

在这种情况下,我想对我的一些操作做一些输出缓存.所以,我的问题是:

  1. 如果输出完全取决于主机名(即忽略本地化要求),那么实现多租户ASP.NET MVC应用程序的输出缓存有哪些可能性

  2. 与(1)相同,但现在考虑输出还取决于培养设置

  3. 与(2)相同,但考虑到输出可能随传递给动作的参数而变化

在这种情况下,我正在考虑所有站点都从一个IIS网站运行.

asp.net asp.net-mvc culture caching multi-tenant

23
推荐指数
1
解决办法
3912
查看次数

覆盖子上下文中父上下文中定义的bean

我们的应用程序需要支持多租户.每个登机客户都可能会覆盖一个或多个bean或核心平台级别定义的bean的某些属性(公共代码/定义).我想知道处理这个问题的最佳方法是什么.

architecture spring java-ee multi-tenant

22
推荐指数
1
解决办法
2万
查看次数

SaaS数据库设计 - 多个数据库?分裂?

我见过SaaS应用程序以多种不同的方式托管.跨多个数据库拆分功能和模块是一个好主意吗?例如,将User表放在一个DB上,将功能/ app特定表放在另一个DB上,也可能放在另一个DB中的其他常用共享表中?

architecture database-design saas multi-tenant database-schema

20
推荐指数
3
解决办法
2万
查看次数

多租户PHP SaaS - 为每个客户端分离数据库,还是将它们分组?

你不得不忍受我在这里可能会使一些术语略显错误,因为我甚至不知道这属于整个"多租户"软件作为服务'类别,但它确实如此.

我为客户开发了一个会员系统(用PHP).我们现在正在考虑将其作为完全托管的解决方案提供给我们的其他客户,提供子域(甚至是他们自己的域).

就数据存储而言,我似乎在桌面上有的选项是:

选项1 - 将所有内容存储在一个大数据库中,并在需要它的表上有一个'client_id'字段(它将有大约30个表适用),并有一个'clients'表存储它们的主要设置,详细信息等等和要映射到它们的域.然后,这只是设置一个包含其各自客户端ID的全局可访问变量 - 我显然必须修改每个查询以检查client_id列.

选项2 - 拥有一个包含"共享参考"表和"客户"表的主表.然后拥有其他数据库的"块",每个数据库包含10个客户端.客户端将获得自己的数据库表,前缀为其客户端ID.这增加了一点安全性,以防止在出现问题时看到其他客户端数据.

选项3 - 与选项2完全相同,除了每个客户端都有1个数据库,完全将它们与其他客户端隔离,理论上提供更多的保护,如果1个客户的表被黑客攻击或以其他方式损坏,它就不会影响其他人.最大的缺点是,在部署新客户端时,整个数据库,用户和密码需要设置等等.这可能还会导致相当大的开销,或者就像你让每个人都在一起一样数据库?

还有几点 - 其中一些客户将拥有5000多个"客户"以及这些客户的所有细节 - 这就是为什么选项1可能有点问题 - 如果我有100个客户,那可能相同一张表中超过五十万行.

我是否正确认为选项3将是客户数据(和支付信息)安全性至关重要的最佳方式.根据我的建议,有些人说选择1是因为"它更容易",但我真的不这么认为.我认为这是潜在的瓶颈,因为如果他们拥有自己的数据库,我肯定可以更容易地移动客户端.

(仅供参考系统基于PHP的PHP系统)

php mysql saas multi-tenant

20
推荐指数
1
解决办法
1万
查看次数