浅析多租户在Java平台和某些PaaS上的实现2013-09-21 IBM 陈 争云多租户综述多租户(Multi Tenancy/Tenant)是一种软件架构,其定义是:在一台服务器上运行单个应 用实例,它为多个租户提供服务。在这种架构上,应用程序被设计成能将自己的数据、配置进行虚拟的分区,以便 每个租户都感觉到自己是在一个私有的、可定制化的应用实例上工作。这背后代表的是资源的伸缩能力。即在同样 硬件配置,不同租户在数据分离的情况下,共享同样的应用程序,还随着租户数量的提升,应用程序的水平扩展,并维持着 类似的性能指标(一致响应时间等)。这同时意味着资源使用效率的提升,以及节省 IT 资产的投入。在共享与安 全之间取得平衡,是多租户架构最主要的关注点。更多的资源共享有益于灵活性的上升和总体成本的下降,但单个租户的安 全性需求要有额外的技术手段来保证。多租户的设计牵涉到两层:数据应用 / 平台数据层的多租户能力是一个很大的主题,主要是指不同的租户如何共享或分离数据,并满足安全性。本文则主要关注的 是应用 / 平台层的多租户规范与方案。Java PaaS 的多租户概况Java 平台已经在 J2EE 中提供了部分多租 户能力。作为 Oracle 要给 Java 平台提供 PaaS 的目标中的一部分,多租户特性在 Java EE 7 最初的规范中有多处体现 ,见表 1。表 1. Java EE 7 中涉及多租户的 JSR

Java EE 7 对 PaaS 模型支持的规范要求:对 PaaS 环境中的同一个 PaaS 应用能够被多个租户使用,每个租户使用不同的应用程序实例,同时又能共享资源。PaaS 规范中要求每个租户都有一个 tenantId,这个 ID 对于某个 PaaS 供应商的全部租户来说,是唯一的。 sevlet 容器可以将外部请求正确映射到对应的租户实例,并在随后的所有业务流程中以 tenantId 为处理的依据,保证不 同租户所使用资源的隔离。同时租户的界面等是可以定制化的。例如带给 JPA 的影响就包括:支持共享数 据库、分离 schema:通过元数据可以对 schema/ 表映射进行重配置。支持共享数据库、共享 schema:厂商可以使用 tenantId 实现数据行级别的隔离。编程模型的影响:将对本地查询和直接 JDBC 访问进行限制。但在 2012 年 8 月 30 号,Oracle 的 Java EE 7 规范主管 Linda Demichiel 在博客中宣布因为云领域相关的应用方式不够成熟,以及 Java EE 7 版本的发布压力,将把 PaaS 和多租户支持的部分推迟到 Java EE 8(以下翻译引用自 InfoQ):尽管 我们的愿望很美好,但是在我们日程表中,云相关的进展仍然很慢。一部分原因在于构建分配(provisioning)、多租户( multi-tenancy)、弹性(elasticity)等领域以及应用部署部分仍然不成熟;一部分原因是我们保守的做事方式,我们尽 力把事情做‘正确’,但是在开展这项工作时,我们在云领域仍然缺乏足够的行业经验。因此,我们认为,若要提供对标准 化的基于 PaaS 的编程方式和多租户的完善的支持,就可能会将 Java EE 7 的发布推迟到 2014 年春天。该时间是两年之 后,比规划晚了一年。在我们看来,拖得时间太长了。因此我们向 Java EE 7 专家组提议调整我们的计划,坚持我 们当前的目标发布日期,而将我们日程表中 PaaS 和多租户支持的部分推迟到 Java EE 8。”那么在 Java 8 中, 与云相关的最重要的两个特性就是多租户与模块化。具体说就是:多租户:指的是在一个 Java 虚拟机(JVM)中安 全运行多个应用的能力。模块化:指的是把 JDK 重新组织为一套尽管互相依赖但却是定义清晰的模块。Java 开发人员 的一个替代选择是使用 OSGi。来自 Red Hat 的 Mark Little 认为下一个 Java 版本支持这两个特性将使得进行大 规模云部署变得可行。同时,Oracle 的规范领导 Linda Demichiel 提到,即使因为云端应用还没完全做好标准化 的准备而导致 Java EE 7 被迫放弃 PaaS 部分,但诸如 Oracle、Red Hat、IBM 和 CloudBees 等供应商已经开始提供在云 上运行 Java EE 程序的能力。因而本文的剩余部分将试图对几种比较流行的 Java 平台解决方案中涉及多租户的部 分做出阐述。