我目前正在考虑将使用Spring,GWT,Hibernate,Jackrabbit,Hibernate Search/Lucene(以及其他)的单租户基于Java的Web应用程序转换为完全成熟的SaaS风格应用程序.
我偶然发现了一篇文章,其中强调了以下7个"事物"作为对单个租户应用程序进行重要更改以使其成为SaaS应用程序:
我的问题是,是否有人使用与我列出的类似技术在SaaS /多租户应用程序中实现上述任何7项内容?在我走上正在考虑的道路之前,我希望得到关于最佳方法的尽可能多的意见.
作为一个开始,我很确定我能够很好地处理如何在模型级别处理多个租户.我正在考虑为所有表添加租户ID,然后使用Hibernate过滤器(以及Hibernate Search的全文过滤器)根据登录用户的所有查询的租户ID进行过滤.
然而,我对性能也有一些担忧,特别是当我们的租户数量增长很多时.
任何有关如何实施此解决方案的建议都将受到高度赞赏(如果这个问题有点过于开放,我会道歉).
我正在尝试设置一个多租户Web应用程序,同时具有(理想情况下)数据库分离和模式分离方法的可能性.虽然我将从Schema分离开始.我们目前正在使用:
大部分时间我都遵循这个主题(因为解决方案@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) 我正在开发一个多租户解决方案,我想使用最新的ASP.NET Identity框架,特别是Entity Framework实现.
基本上我需要允许两个用户拥有相同的用户名,虽然它必须在租户中是唯一的,我也想利用外部登录,如Twitter,微软,Facebook和谷歌.
据我所知,该框架并未考虑多租户设计,尽管它似乎确实允许可扩展性.我宁愿尽可能多地使用现有组件,但目前我认为我将不得不放弃实体框架实现,并自己编写代码.
有没有其他人试过这个,他们有多少自己编码.
如何根据请求初始化Apartment时,如何找出当前的租户(架构)
我在ASP.NET MVC中有一个多租户应用程序.将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致).
应用程序的每个实例可能具有不同的文化设置(甚至"自动",以阅读浏览器的语言并尝试使用它),并将相应地进行本地化.
在这种情况下,我想对我的一些操作做一些输出缓存.所以,我的问题是:
如果输出完全取决于主机名(即忽略本地化要求),那么实现多租户ASP.NET MVC应用程序的输出缓存有哪些可能性?
与(1)相同,但现在考虑输出还取决于培养设置?
与(2)相同,但考虑到输出可能随传递给动作的参数而变化?
在这种情况下,我正在考虑所有站点都从一个IIS网站运行.
我们的应用程序需要支持多租户.每个登机客户都可能会覆盖一个或多个bean或核心平台级别定义的bean的某些属性(公共代码/定义).我想知道处理这个问题的最佳方法是什么.
我见过SaaS应用程序以多种不同的方式托管.跨多个数据库拆分功能和模块是一个好主意吗?例如,将User表放在一个DB上,将功能/ app特定表放在另一个DB上,也可能放在另一个DB中的其他常用共享表中?
architecture database-design saas multi-tenant database-schema
你不得不忍受我在这里可能会使一些术语略显错误,因为我甚至不知道这属于整个"多租户"软件作为服务'类别,但它确实如此.
我为客户开发了一个会员系统(用PHP).我们现在正在考虑将其作为完全托管的解决方案提供给我们的其他客户,提供子域(甚至是他们自己的域).
就数据存储而言,我似乎在桌面上有的选项是:
选项1 - 将所有内容存储在一个大数据库中,并在需要它的表上有一个'client_id'字段(它将有大约30个表适用),并有一个'clients'表存储它们的主要设置,详细信息等等和要映射到它们的域.然后,这只是设置一个包含其各自客户端ID的全局可访问变量 - 我显然必须修改每个查询以检查client_id列.
选项2 - 拥有一个包含"共享参考"表和"客户"表的主表.然后拥有其他数据库的"块",每个数据库包含10个客户端.客户端将获得自己的数据库表,前缀为其客户端ID.这增加了一点安全性,以防止在出现问题时看到其他客户端数据.
选项3 - 与选项2完全相同,除了每个客户端都有1个数据库,完全将它们与其他客户端隔离,理论上提供更多的保护,如果1个客户的表被黑客攻击或以其他方式损坏,它就不会影响其他人.最大的缺点是,在部署新客户端时,整个数据库,用户和密码需要设置等等.这可能还会导致相当大的开销,或者就像你让每个人都在一起一样数据库?
还有几点 - 其中一些客户将拥有5000多个"客户"以及这些客户的所有细节 - 这就是为什么选项1可能有点问题 - 如果我有100个客户,那可能相同一张表中超过五十万行.
我是否正确认为选项3将是客户数据(和支付信息)安全性至关重要的最佳方式.根据我的建议,有些人说选择1是因为"它更容易",但我真的不这么认为.我认为这是潜在的瓶颈,因为如果他们拥有自己的数据库,我肯定可以更容易地移动客户端.
(仅供参考系统基于PHP的PHP系统)
multi-tenant ×10
saas ×3
architecture ×2
postgresql ×2
spring ×2
asp.net ×1
asp.net-mvc ×1
c3p0 ×1
caching ×1
culture ×1
hibernate ×1
java ×1
java-ee ×1
mysql ×1
performance ×1
php ×1
schema ×1
subdomain ×1