繁体   English   中英

为成熟的企业应用程序实现多租户

[英]Implementing multi-tenancy for a mature enterprise application

我的任务是创建一个企业应用程序多租户。 它有一个使用SOAP Web服务和PostgreSQL后端的Java / Glassfish BLL。 每个租户都有自己的数据库,因此(至少在我的情况下)“多租户”意味着每个应用服务器支持多个数据库。

当前的单租户appserver使用从配置文件获取的连接字符串初始化C3P0连接池。 我的想法是,现在需要为appserver服务的每个客户端/数据库建立一个连接池。

用户登录后,我可以通过查找其租户将其映射到正确的连接池。 我的主要问题是如何实现这一目标 - 当用户首次登录时,将查询后端的User表并提供相应的User对象。 似乎我需要知道使用哪个数据库只使用用户名。

我唯一不错的想法是需要一个“配置”数据库 - 一个用于管理租户信息(如连接字符串)的集中数据库。 BLL可以查询此数据库以获取足够的信息来初始化必要的连接池。 但由于我只有一个用户名,我似乎也需要一个集中的用户名查找,换句话说,一个UserName表与Tenant表的外键。

这是我的设计计划开始闻到的地方,让我怀疑。 现在,我将在两个单独的数据库中拥有用户信息,这些数据库需要同步维护(用户添加,更新和删除)。 此外,用户名现在必须是全局唯一的,而在它们之前,每个租户只需要是唯一的。

我强烈怀疑我正在重新发明轮子,或者至少有一个更好的架构可能。 我以前从未做过这种事,也没有任何人在我的团队中,因此我们无知。 遗憾的是,该应用程序很少使用现有技术(例如,ORM是在家中推出的),因此我们的路径可能很难。

我要求以下内容:

  • 批评我现有的设计计划,以及改进或重新设计架构的建议。
  • 针对此问题提供解决方案的现有技术建议。 我希望能在游戏后期轻松插入一些东西,尽管这可能是不现实的。 我已经阅读过关于jspirit的内容 ,但是没有找到关于它的信息 - 对它或其他框架的任何反馈都会有所帮助。

更新:该解决方案已成功实施和部署,并已通过初始测试。 感谢@mikera的有用和令人放心的答案!

一些快速的想法:

  • 您肯定需要某种形式的共享用户管理索引 (否则您无法将客户端登录与正确的目标数据库实例关联)。 但是,我建议将其设置为非常轻量级,并且仅用于初始登录。 一旦确定了哪个数据库,您的用户对象仍然可以从特定于客户端的数据库中提取。
  • 您可以创建主键[clientID,username],以便用户名不需要在客户端之间是唯一的。
  • 除了这个瘦的用户索引层,我会将大部分用户信息保存在客户端特定的数据库中 现在重构这个可能会造成太大的破坏性,你应该先获得基本的多租户功能。
  • 您需要使共享索引与各个客户端数据库保持同步 但我不认为这应该太难。 您还可以“测试”同步并使用批处理作业更正任何错误,这可以在一夜之间运行,也可以由DBA按需运行,如果有任何不同步的话。 我将客户端数据库视为主数据库,并使用它来按需重建共享用户索引。
  • 随着时间的推移,您可以重构一个完全共享的用户管理层(如果您愿意,甚至可以在最终完全共享的客户端数据库中进行重构 。但是将其保存以供将来的迭代使用.....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM