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

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

问题描述:

我的任务是制作企业应用程序多租户。它有一个使用SOAP Web服务和PostgreSQL后端的Java/Glassfish BLL。每个租户都有自己的数据库,所以(至少在我看来)“多租户”意味着每个应用服务器支持多个数据库。为成熟的企业应用程序实施多租户

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

一旦用户登录,我可以通过查找其租户将其映射到正确的连接池。我的主要问题是如何得到这一点 - 当用户第一次登录时,后端的User表被查询并且对应的User对象被提供。看来我需要知道哪个数据库只能使用一个用户名才能使用。

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

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

我强烈怀疑我正在重新发明车轮,或者至少有更好的建筑可能。我以前从来没有做过这种事,我的团队也没有人,所以我们的无知。不幸的是,这个应用程序很少使用现有的技术(例如ORM就是自制的),所以我们的路线可能会很艰难。

我要求如下:我现有的设计方案

  • 批评,以及提高或再处理架构的建议。
  • 提供解决此问题的现有技术的建议。我希望在游戏后期能够轻松插入一些东西,尽管这可能是不现实的。我已阅读了关于jspirit,但发现它几乎没有任何信息 - 任何反馈或其他框架将有所帮助。

UPDATE:该解决方案已成功实施和部署,并已通过初步测试。感谢@mikera他的帮助和令人放心的答案!

一些快速的想法:

  • 你一定会需要某种形式的共享用户管理指数的(否则你不能用正确的目标数据库实例的客户端登录关联)。不过,我会建议做到这一点非常轻量级,并且只能使用它进行初始登录。一旦确定了哪个数据库,您的User对象仍然可以从客户端特定的数据库中提取。
  • 您可以使主键[clientID,用户名],以便用户名不需要在客户端是唯一的。
  • 除了这个瘦用户索引层,我会保持大部分用户信息在客户端特定数据库。现在重构这个可能会太破坏性,你应该首先获得基本的多租户功能。
  • 您将需要使共享索引与各个客户端数据库保持同步。但我认为这不应该太难。您还可以使用批处理作业“测试”同步并纠正任何错误,这可以在一夜之间运行,或者如果出现任何不同步的情况,您可以根据需要由您的DBA运行。我将客户端数据库视为主数据库,并使用它来根据需要重建共享用户索引。
  • 随着时间的推移,你可以重构向完全共享用户管理层(甚至是完全共享的客户数据库,如果你喜欢,但这种保存为将来的迭代结束.....
+0

+1这个答案是令人放心的,config数据库会很轻 - 正如你所说的,只有在连接池初始化和用户名查找过程中才会使用。关于夜间批量作业清理/报告松散结束的优点。 –