在 Java EE 容器中扩展云特性【来源于网络】
Java 企业版(JEE)架构是基于组件的,拥有可以高效管理应用程序事务和有状态性、多线程和资源池的特性。即使是复杂的需求,JEE 应用程序也很容易实现,因为业务逻辑是以可重用的组件组织的,并且服务器为各种组件(以容器 的形式)提供了底层服务 。
我们认为,可以通过增加一些云计算的强大概念 — 即并行性、灵活性、多租户和安全性 — 给 JEE 的容器服务概念增加更多的功能,这是一种全新的概念。本文将介绍给 JEE 容器和应用程序扩展一些云计算特性的策略和模式。其中包括:
概括介绍我们整合的每一种云特征。 JEE 应用程序的现有特征的布局。 介绍我们用于将 JEE 容器扩展到云上的方法。 提出关于这种类型迁移的一种设计策略,它包含并行、同步、存储、灵活、多租赁和安全等概念。
云协议的最基础部分是 Infrastructure as a Service(IaaS)。这些基础架构已经转移到云环境中了,并且云环境现在能够支持包括业务应用程序在内的软件部署。然而,IaaS 并没有一个应用程序开发环境或者测试服务。如图所示,抽象的顶部是灵活性、自动部署和实用计算。
Platform as a Service (PaaS) 层提供了应用程序软件创建、部署和维护的环境。PaaS 提供者必须提供基本的生命周期服务,如编译、部署、测试和构建块服务,如状态管理、事务和安全性,以及运行时的资源管理服务。
Software as a Service (SaaS) 层为最终用户提供了访问和使用应用程序的环境。
应用程序需要支持的基本云特征有灵活性和多租户。其他特征,如分配和自动化,是通过应用程序服务器的部署特性支持的,并且对代码没有太大的影响。并行性、分布式存储需求和安全性增强是作为一些实现灵活性和多租户的辅助特征。
现在让我们详细了解每一种特征。
容器或应用程序可以通过 JNDI 获得资源管理器的控制。资源管理器实现了对象池,它能够获得实现持久化、安全性状态管理和事务的托管资源模式。
容器提供的每一个服务都可以分解为其中一种模式,或者两种模式组合。例如,Java Message Service (JMS) 具有一种 JMS Destinations 的托管资源模式和一种 JMS MessageListener 托管任务模式。类似地,JDBC Connection 是一种托管资源模式。
现在,我们已经介绍了 JEE 容器的应用程序的工作方式,接下来让我们了解如何将一个容器应用程序扩展到云上。
表 2 详细列出了每个云特征及其相应的设计策略是如何影响 JEE 实现特征的,以及所引用的模式。
回页首
扩展容器:通用容器服务方法
修改现有的容器服务以匹配云资源和云任务模式,并尽可能以非侵入方式将它们附加到应用程序上。总而言之,我们将所有服务转换为云资源模式;当应用程序与云资源模式交互时,它会将这个模式转换为云任务模式,从而支持在云中使用。下面的清单列出了我们所使用的服务、原始方法和方法。
服务: JDBC Database ConnectionsgetSession()
,将它转换为一个云资源。从而不需要严格的会话。 回页首
对设计策略的影响
最后,让我们了解一下在您的应用程序中启用云特征会如何影响设计策略。我们将介绍以下方面:
同步和异步并行性。 数据到达和线程完成同步。 复制节点、随需复制、支持故障恢复的单向复制和存储端的文件系统共享。 松耦合和无状态性。 灵活性。 单个存储或分离存储的多租户。 安全性。并行性
正如之前提到的,并行性指的是任务的并行处理能力,其中任务会分成不同的子任务,它们最后会合并为一个。并行性支持两种策略:同步和异步。
同步
在这种策略下,调用者要等待执行完成之后才能继续后续的任务。每一个任务都使用一个服务调用触发。任务会等待调用者返回。并行性是通过运行主线程为每一个任务调度执行的子线程而实现的,这样任务就会并发执行,而每一个线程是同步执行任务的。
同步策略最适合于数据聚合。当应用程序需要使用不同来源的信息时,来自每个源的数据可以同步获得,而每个源可以同时提取。
异步
在这种策略下,调用者会使用消息以异步方式执行一个任务。当任务完成时,任务的输出会保存在一个持久化存储区中,供下一个任务使用。
这种策略更适合用来处理复杂任务。每一个复杂任务都是异步执行的,它们都会使用同步策略来调用数据聚集任务。
同步策略
同步策略会保证事务支持,从而保证任务的可靠性。它保证相关的任务和数据在下一个任务处理之前就准备好。同步策略有两种:基于数据到达和基于线程完成的同步。
基于数据到达的同步
基于数据到达的同步指的是,任务的执行是基于特定位置的特定数据到达而触发的。当使用了异步调用,而调用的任务需要查找所调用任务在特定位置生成的输出才能够继续后续操作时,这种方法是特别重要的。
一个线程会检查数据区,检查数据的到达。当数据到达时,它会马上发送一条消息给需要触发的任务。MessageListener 是数据到达同步的一种实现。
基于线程完成
在线程完成同步中,资源监控器会检查并发的线程,然后同步这些任务的执行,同时访问该资源。通过组合数据到达策略和线程完成策略,相同的策略可以应用到一个必须在多个实例之间共享的资源上。
这个策略通常会应用到一个 JVM 中的线程上。对于外部资源,这个方法是数据到达同步机制的扩展,其中监控器状态是数据,监听器会把数据传递给当前 JVM 中执行的线程。
存储
存储的类型有很多种;数据库、文件系统、内存数据和诸如原生目录等持久化设备都是存储。存储策略的一个重要需求是要保证 JEE 应用程序能够创建一个真正的网络对象,这个对象的状态变化会反映到集群中所有的 JVM 上,并且能够在动态 RDBMS SQL 失效时移植到一个分布式数据源上。此外,存储策略是并行性和多租户的一个重要组成部分。
复制节点
复制节点策略指的是,相同的数据存在于不同的节点上,并且能够快速地复制其他节点。数据库支持暖复制和热复制策略。其他存储区则需要使用分两个阶段提交的策略。
这个策略的执行至少需要两个线程的支持。其中一个线程会同步调用保存/更新操作。它会通过套接字连接将数据发送给其他节点,然后接收响应,它会发出提交命令,这个命令实际上会更新这些节点。监听器线程会监听其他节点的变化,并对它们作出响应。套接字连接可以替换成基于消息或 http 的服务。
复制是最适合用于较少更新的只读数据。复制的开销很大。所有缓存和内存数据都可以重新设计为基于存储的复制节点。
随需复制
这是复制策略的一种变化,其中常规提交是针对当前节点的,而这个节点可以逻辑点触发复制。这个复制也可以是采用同步策略的随需触发器。
对于每个节点处理不同部分数据并在逻辑步骤中整合这些数据的情况,随需复制是很有帮助的。MapReduce 风格的编程模型也可以使用这种策略。
支持故障恢复的单向复制
复制还有另一个变化就是分配一个主节点,然后将所有数据从主节点复制到子节点。在故障恢复过程中,其中一个子节点会成为主节点,而所有复制将从该节点开始。这种复制总是从主节点开始。这种策略可以与文件系统共享策略一起实现高可用性。
文件系统共享
这通常用在复制开销非常大的基于文件系统的资源存储。在这里,文件系统本身会在不同节点之间切换,以实现负载均衡。这不会提供一种简单的可用性方法,但是已经很接近了。关系数据库文件系统可以按这种方法进行处理。
松耦合性和无状态性
无状态性是通过保证调用所需数据的可用性实现的,而且这不依赖于处理请求的主机。松耦合保证了一个调用是可替换的。基于 HTTP 的 REST 或 Web Service 都能够保证这一点。
灵活性
灵活性是通过保证并行性支持和事务支持的正确混合实现的,而且更重要的是,其执行过程是无状态性,因此是可以重复的。每一个执行的状态都是单独持久化的。对象的同一个实例在执行中会有多个线程;每一个线程保存该对象的一个方面。这能够减少池中多个对象的需要。有一些数据库提供商已经实现了一种可共享连接来处理这个特性。这意味着平均 2 到 3 个连接就足够处理 20 至 30 个并发共享读取事务。
事务持续时间越短,它就具有更高的灵活性。将一个长期运行的任务分割成多个可重复的无状态任务能够显著地减少事务大小。
多租户
多租户指的是,通过足够的数据分离,应用程序的一个实例实际上能够服务多个客户。多租户有一些不同的设计问题,但是其中不需要进行代码重构就能够解决的一个重要问题是使用一个还是多个存储来保存不同用户的数据。
用一个存储支持多个用户
这意味着所有客户都共享一个存储资源。这种配置更容易维护,也更容易扩展,因为其中只有一个逻辑分离,因此每一个数据元素都可以使用不同的密钥进行加密。这种模式和分区能够实现数据的逻辑分离,而名称空间则能够实现 XML 数据的逻辑分离。
每一个用户使用独立的存储
每一个客户都有自己的存储。这种策略采用的是物理数据分离方法。这种模型适合那些包含敏感数据的应用程序。这种分隔的存储应该使用一种路由服务来访问,以便将复杂性从编程逻辑剥离。
安全性
分布式存储和多租户会带来额外的安全性需求。这种安全性策略需要解决存储、消息和传输等方面的安全性。此外,混合云或虚拟私有云实现都要求使用跨域的单点登录方法,因此联合机制也会在这里发挥重要作用。
额外的安全性需求是与应用程序相关的云特征的一种分支,因此它可以在不影响其余功能和代码的前提下实现。
回页首
结束语
本文概括的提出了一些设计策略和模式,它们可以帮助您在容器服务中实现云特征,以及帮助您将应用程序移植到云上。云资源模式和云任务模式的设计是为了实现重用,所以我们并不要求您选择这种策略。
我们还介绍了云应用程序的特征,以及 Java EE 容器和应用程序的相应特征。我们将托管资源和托管任务模式转变成云资源和云任务模式,以便向您介绍如何将容器服务扩展为云应用程序使用的服务。
此外,我们还介绍了将 JEE 容器整合到云应用程序中对云应用程序设计策略的影响。
最后,我们想要指出的是,JEE Connector Architecture (JCA) 是一种实现托管资源和托管任务模式扩展的方法之一。JEE Connector Architecture 提供了定义资源工作、生命周期、连接和事务管理的框架,以及改进安全性架构、入站通信和消息流入的框架。