我正在开发混合移动应用程序,并基于spring mvc和hibernate实现了基于java的rest api。我使用MySql作为数据库。对于身份验证,我实现了Oauth2.0。
目前我有一个客户端,所以我使用单个数据源。但我的要求改变了我有5个客户,每个客户最少1000个用户。所以决定使用多租户单独的数据库方案。但有一些用户需要从所有租户或租户组合中获取数据,并在一些计算后将其结果显示在仪表板中。
我还希望实现一个额外的特定租户特定队列层,用于保存特定于租户的请求。
我该怎么做?
答案 0 :(得分:0)
我之前使用EclipseLink和支持MySQL(以及其他6个DBMS)实现了类似的功能。在这种情况下,应用程序在企业中使用,但您可以有多个项目隔离不同的部门(租户),您可以定义可以查看所有项目数据的用户。
关键是在您的ER图中引入租户实体作为顶级实体,每个其他实体都属于租户。
@Entity
public class Tenant {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL)
private Collection<User> users;
@OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL)
private Collection<TenantConfiguration> configurations;
}
您必须应对的一个挑战是安全性。在每个请求中,您必须验证用户是否有权访问所请求的实体(从不信任前端)。这意味着您OAuth2身份验证(在登录期间创建)需要包含对实体的引用,该实体允许您确定用户租期和权限。出于性能原因,您通常在JPA查询中包含租期(TENANCY_ID),以避免加载大量数据并将其过滤到内存中。
祝你好运