标签: multi-tenant

是否有基于ASP.NET MVC订阅的入门套件或示例?

基本上是处理基于订阅的服务的低级"管道"代码的东西.我看到许多涉及基本会员资格的事情,但没有处理订阅方面的事情(定期计费,设置计费的自动化工作,计费通知等).这可能是让我不能使用ASP.NET MVC来实现我的SaaS理念的一件事,因为编写自己的开发时间需要相当长的时间.如果我选择其他选项,Ruby on Rails,我可以购买一个套装,以250美元的价格完成所有这些工作.我还没有找到任何与.NET相关的东西 - 我见过的所有SaaS示例应用程序更像是StackOverflow等所有你有一个多人登录的站点,而不是你所在的Web应用程序模型订阅者每月收费,每个订户都有自己网站的用户和其他实体(例如客户,任务等).

有什么类似的ASP.NET,或者我必须编写自己的某些指导原则,所以我不浪费太多时间?作为一个创业公司,这意味着我自己正在做所有的编码.

我发现了这一点,但它似乎只是为了计费而且似乎没有太多(任何?)文档关于如何设置它.

asp.net-mvc saas multi-tenant

19
推荐指数
2
解决办法
4683
查看次数

使用Symfony2和Doctrine2开发多租户应用程序的最佳实践

我正在开发一个需要支持多租户模型的应用程序.我正在使用symfony2 php框架和doctrine2.

我不确定构建此要求的最佳方法.Symfony的ACL功能是否提供了解决方案的一部分?

您可以提供哪些建议或想法?是否有任何已实施此策略的示例symfony2应用程序或开源应用程序?

我的第一个想法是在所有表中使用tenant_id列,并将其与应用程序中的帐户对象相关联.我不确定ACL是否应该照顾我想要做的事情,或者你是否还要对所有针对你的对象的查询负责,这样他们就不会返回未经授权的数据.

如果我没有使用Doctrine,可能很容易说只是附加Where tenant_id = @accountid到每个查询,但我不确定这是正确的方法.

谢谢

php saas multi-tenant symfony doctrine-orm

19
推荐指数
2
解决办法
4337
查看次数

Spring + Hibernate的多租户:"SessionFactory配置为多租户,但没有指定租户标识符"

在Spring 3应用程序中,我试图通过Hibernate 4的本机MultiTenantConnectionProviderCurrentTenantIdentifierResolver实现多租户.我看到Hibernate 4.1.3存在这个问题,但是我运行4.1.9并且仍然遇到类似的异常:

   Caused by:

org.hibernate.HibernateException: SessionFactory configured for multi-tenancy, but no tenant identifier specified
    at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:84)
    at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:239)
    at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1597)
    at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:963)
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:328)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:334)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    at com.afflatus.edu.thoth.repository.UserRepository$$EnhancerByCGLIB$$c844ce96.getAllUsers(<generated>)
    at com.afflatus.edu.thoth.service.UserService.getAllUsers(UserService.java:29)
    at com.afflatus.edu.thoth.HomeController.hello(HomeController.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:746)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:687)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:811)
    at …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate multi-tenant

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

弹性搜索中的多租户

我们计划为我们的多租户应用程序引入弹性搜索(AWS).我们有以下选项,

  1. 使用每个租户一个索引
  2. 每个租户使用一种类型
  3. 所有租户与自定义路由共享一个索引

根据这篇博客https://www.elastic.co/blog/found-multi-tenancy,第一个选项会产生内存问题.但不清楚其他选择.

看来如果我们使用第三个选项那么就没有数据隔离.不确定安全性.

我认为第二种选择是更好的选择,因为数据会被隔离.

帮助我确定使用多租户进行弹性搜索的最佳选项.

请注意,我们将利用AWS基础架构.

multi-tenant elasticsearch amazon-elasticsearch

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

多租户Django应用程序

是否有人们使用Django创建多租户应用程序的常见模式.内置的"站点"框架似乎是一种选择.人们有成功的其他方法吗?

django multi-tenant

17
推荐指数
2
解决办法
3918
查看次数

多个模式与巨大的表格

考虑一个移动设备管理器系统,其中包含每个用户的信息,例如存储他已安装在手机上的应用程序的表,审核详细信息,通知信息等.为每个用户创建一个单独的模式以及相应的表是明智的吗?对于单个用户而言,表的数量很大,每个用户大约30个表.拥有一个单独的模式,将所有这些信息放入这些表(反过来创建庞大的表?)或为每个用户设置模式会更好吗?

提前致谢

database database-design multi-tenant database-performance

17
推荐指数
1
解决办法
6934
查看次数

使用Hibernate 4.2和Spring 3.1.1设置MultiTenantConnectionProvider

我目前正在尝试使用单独的Schema aproach为多租户设置Hibernate.
在完成了大约2天的工作并浏览了几乎所有我可以通过Google找到的来源后,我开始变得非常沮丧.

Basicaly我试图遵循Hibernate devguide http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4691中提供的指南
但不幸的是我无法找到ConnectionProviderUtils到构建ConnectionProvider.目前我想弄清楚2点:

  1. 为什么永远不会调用我的MSSQLMultiTenantConnectionProvider的configure(Properties props)方法.根据我从不同的其他ConnectionProvider实现的来源和描述中解释,我假设将调用此方法来初始化ConnectionProvider.

  2. 由于我无法使用configure(属性道具),我尝试了以某种方式获取应用程序Context和hibernate.cfg.xml中指定的hibernate属性和DataSource的其他方法.(就像将数据源直接注入ConnectionProvider一样)

任何可能的解决方法的指针(方法,类,教程)

以下是我的实现的相关部分:
Data Source和Hibernate.cfg.xml:

    <bean id="dataSource"   class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="url" value="jdbc:sqlserver://<host>:<port>;databaseName=<DbName>;" />
        <property name="username" value=<username> />
        <property name="password" value=<password> />
   </bean>
   <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <!-- property name="dataSource" ref="dataSource" /-->
        <property name="annotatedClasses">
            <list>
                <value>c.h.utils.hibernate.User</value>
                <value>c.h.utils.hibernate.Role</value>
                <value>c.h.utils.hibernate.Tenant</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.SQLServerDialect
                hibernate.show_sql=true
                hibernate.multiTenancy=SCHEMA
                hibernate.tenant_identifier_resolver=c.h.utils.hibernate.CurrentTenantIdentifierResolver
                hibernate.multi_tenant_connection_provider=c.h.utils.hibernate.MSSQLMultiTenantConnectionProviderImpl 
            </value>
        </property>
    </bean>
Run Code Online (Sandbox Code Playgroud)

MSSQLMultiTenantConnectionProviderImpl:

package c.hoell.utils.hibernate;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.hibernate.service.UnknownUnwrapTypeException;
import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.springframework.beans.factory.annotation.Autowired;
import …
Run Code Online (Sandbox Code Playgroud)

orm spring hibernate multi-tenant

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

对多租户,或不对多租户

我有一个困难的数据库设计决策,为我的客户基于网络的CRM的越来越多的分支机构提供多租户,我积极维护.

我很早就决定为每个分支使用单独的应用程序和单独的数据库,因为这是满足不同数据和代码要求的三个不同分支的最简单方法.我还想避免在每个查询中管理租户ID ,就像我在2007年建立的遗留经典ASP(cringe)应用程序一样......恐怖.

但现在分支机构的数据需求正在趋同,随着业务的扩展,我需要能够快速推出新的分支机构并共享全球产品SKU.

由于所有分支的表和视图都相同,并且现在可以使用更好的ORM工具来管理多租户应用程序,我想知道为多个分支创建共享数据库是否更好.

注意事项对于一个集中的数据库:

  • 全球产品SKU
  • 简化的库存申请
  • 更容易备份
  • 部署一次而不是每个分支

针对集中式数据库的注意事项:

  • 使用单独的DB更容易区分分支需求
  • 模块化部署(一个被击落的分支不会破坏所有)
  • 更难以管理和开发共享数据库
  • 我必须重新设计发票编号(由种子生成的序列)
  • 到处都是WHERE条款
  • 恢复一个破碎的分支对其他分支有很多影响

不太可能有多达10个分支机构.现在有3个.

在这方面具有实际经验的开发人员,您在我的情况下会做些什么?将应用程序和数据库分开,还是组合成一个巨大的系统?


编辑:伟大的微软的文章在多租户亲的利弊.我应该注意,分支之间的数据隔离不是主要问题.

sql-server asp.net database-design fluent-nhibernate multi-tenant

16
推荐指数
2
解决办法
3556
查看次数

在多租户应用程序中动态设置Flask-SQLAlchemy数据库连接

我有一个" 多租户 " Flask Web应用程序,它与1个"主"MySQL数据库(用于查找客户端信息)和数十个"客户端"MySQL数据库(都具有相同的模式)连接.

我目前正在尝试使用SQLAlchemyFlask-SQLAlchemy扩展来与数据库连接,但我很难找到一种方法来允许我在我的应用中定义的模型动态地将上下文从一个客户端数据库切换到另一个客户端数据库,取决于客户.

Flask-SQLAlchemy站点上,一个简单的示例如下所示:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@Y.Y.Y.Y/db1'
db = SQLAlchemy(app)

class User(db.Model):
    # Etc.
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,SQLALCHEMY_DATABASE_URI配置是静态完成的.我可能需要在mysql://username:password@Y.Y.Y.Y/db1mysql://username:password@Z.Z.Z.Z/db1(或任何其他任意MySQL URI)之间切换,具体取决于发出请求的客户端.

我发现了一些类似的问题(见下文),但是在使用Flask-SQLAlchemy扩展时,我还没有找到一种干净的方法.

使用sqlalchemy如何基于每个请求动态绑定到数据库引擎

Flask SQLAlchemy设置动态URI

我还看到了一些为处理分片数据库而提供的示例(也应该适用,因为数据库本质上是由客户端逻辑分片),但同样,Flask-SQLAlchemy没有特定的内容.

如果它有意义,我也可以直接使用SQLAlchemy,而不使用Flask-SQLAlchemy扩展.我是SQLAlchemy的新手 - 非常感谢任何帮助!

编辑:能够反映数据库中的表模式将是一个奖励.

python sqlalchemy multi-tenant flask flask-sqlalchemy

16
推荐指数
1
解决办法
5059
查看次数

多租户还是多实例?

我正在尝试构建基于Web的SaaS解决方案,并且我遇到了一条我不确定使用多租户或多实例的道路.我将尝试描述我想要实现的目标,以及每种方法的优点和缺点(我的观点,根据我所读到的).请提供您的建议,以防我错过任何一种方法而不是另一种方法.

正如我所提到的,我正在尝试构建的应用程序是一个SaaS解决方案,公司可以在其中创建帐户,每个帐户/公司都拥有自己的用户,客户,产品,服务等.每个用户; 谁是公司员工; 与一个帐户/公司相关的只能访问他/她公司的客户,产品和服务.公司可以拥有无​​限数量的客户,产品和服务,因此每家公司都应拥有自己的数据中心.

为此我决定创建一个共享数据库(为登录目的保存所有用户凭据)和多个数据库共享模式(每个帐户/公司的数据库).基本上,多租户.

然后有人建议使用Multi Instance,其中每个公司都有自己的应用程序实例(即代码,库,数据库,框架等)与其他公司完全分开.这听起来更好,因为我不需要处理额外的层,我需要确保每个租户的用户只能访问他们公司的数据.我认为值得一提的是我依赖Docker来实现这种方法(我之前从未使用过它),但我认为它缺乏功能(后面会更多)我将来需要(至少我没有通过一点点搜索找到它们.

但是,每种方法都有利有弊,所以我无法决定采用哪种方法.这是一个列表,但由于我缺乏对它们的了解,所以我可能会遇到一些我不知道的事情,或者是我在网上找不到的问题的解决方案:[每种方法都有一个有序列表,我跟着一个一个比较]

多租户:

  1. 共享主机/硬件,共享代码和多数据库.
  2. 这是比较容易扩展代码的功能并修复错误(共享代码).
  3. 这是很难延长硬件(可以使用云服务),或个别租户的数据库移动到另一个系统没有做修改代码.
  4. 最重要的是,正如我之前提到的,我需要在系统中添加一个额外的层,以确保用户实际上属于他/她的公司,而不是访问其他公司的信息.

多实例:

  1. 共享或非共享主机/硬件,每个实例的代码和每个实例的数据库.
  2. 这是很难扩展功能或修复错误(我不知道是否有办法做到这一点在码头工人在那里你可以添加功能/特性,以一个实例或码头集装箱,并将其部署到其他人).
  3. 这是更容易对整个实例移动到不同的主机/硬件.
  4. 作为实例,我不需要处理该层,因为每个实例都有自己的数据库.

如果我想手动执行任何操作(因为手动为每个租户创建实例),所有优点和缺点都是多余的,这就是我怀疑Docker解决方案的原因,除非有办法解决这个问题,这可能是主要的问题的原因.如果您能够通过参考解决方案来回答问题,我将不胜感激,为什么您认为这种方法比其他方法更好.

如果有帮助(可能?),我们使用Laravel作为后端的主要框架(所有RESTful).

architecture saas multi-tenant docker

16
推荐指数
3
解决办法
3718
查看次数