高峰保护软件:预测需求高峰的体系结构 您的 web 应用程序处理全球大量用户的并发事件时,高性能的伸缩性以及可用性是关键 — 因为点击会不断地发生。
现在,参加诸如 OracleWorld 等活动的用户希望通过其浏览器做很多操作 — 向应用程序设计师提出了严峻的挑战,包括活动营销公司 George P. Johnson 的技术副总裁 Michael Winner。
Winner 说:“自从 Web 应用程序出现以来,我们应用程序中的数据和逻辑数量呈指数增长。用户能做的事情的范围比我们在五到七年以前所看到的范围要广泛得多。用户能够进行实时电子商务交易、预订旅馆、会议签名、上传和下载演示、从不同的旅馆使用无线登记。现在很多这类的会议都有非常技术性的观众。”
在举办活动时的事务量高峰为 Winner 的应用程序开发人员团队增加了更多的难题。“在 Moscone 中心的一次活动中,我们谈论为所有展出摊位打印,比如 15,000 到 20,000 个证件。那么,我们要处理所有正在进行的信用卡事务,还有线索的检索 — 有很多很多不同的供应商、第三方供应商以及与客户和用户相关的活动正在发生。”
会议的这一切可能只是由 George P. Johnson 公司的主服务器设备在一个周末所处理的若干全球活动中的一项。
Winner 承认:“活动管理是强度很大并且独一无二的应用程序为了解决由这些需求所造成的挑战 — 并且开发出适用于各种各样客户和活动的应用程序 — Winner 的团队使用了大量的策略。其中包括分层的应用程序体系结构、多个组件的高速缓存和集群、对代码变化的严格管理过程。
分层的方法 George P. Johnson 公司核心活动管理应用程序的开发工作规模很大,涉及到大量有关如何最好地满足性能目标的计划和策略制定。Winner 说:“我们开始设计一个能够处理数以百万计的事务以及数万并发用户的全球应用程序,具有一系列用于活动营销和活动管理的非常强健的功能需求 — 并且具有全天候的可用性。其工作涉及到至少 50 人来设计、构建和部署该应用程序,此外还有大约一百人在项目管理和测试等领域中工作。”
图 1:体系结构 由于 Winner 的团队并没有原有系统,他们在选择符合其性能目标的设计时有很大的自由度。Winner 解释说:“我们决定为每个应用程序组件创建单独的层,并为每层选择可用的最好的技术 — 选择那些我们知道能够快速进行开发并良好扩展的、经过验证的高性能技术。我们调查每个组件在峰值使用时期需要处理什么,并相应地扩展我们的系统,对于在预算允许时逐渐增加的项目作出计划。我们知道应用程序最终必须在每层(从数据库到 Web 服务端和代码端)处理每分钟 10,000 到 20,000 次点击。”
在说明选择产品的过程时,Winner 说:“我们对所提供的产品进行了大量的研究,并决定在我们的 Web 服务层使用 Oracle 数据库和 Oracle 应用服务器 (OracleAS)。强烈推荐 Oracle 作为获得我们所需要的那种可伸缩的高可用性和性能的最好方法。”
Winner 说,他的团队利用 Oracle 数据库和 Oracle 应用服务器获得成功的关键在于它们提供高速缓存和集群的功能。
高速缓存获得高性能 Oracle 应用服务器向 Winner 的团队快速证明其价值的一个方面是 OracleAS Web Cache。
他回忆说:“我们第一次开始使用它是在两年前。我们为一个客户设计应用程序,该应用程序允许所有用户下载演示。在我们最初对产品进行说明时,我们对客户将要为其用户提供的信息量 — 包括视频和声音可视资料 — 的准备不够充分。
“因此,基于我们为获得更高性能而进行高速缓存所需的特定文件格式,我们使用 Web Cache Administrator 为该活动建立特定的规则,假定为使用该应用程序并需要获得那些演示的人们提供一个为期五天的窗口。”
其结果超出了预期水平,从而说服了公司在其应用程序中更加广泛地使用 Web 高速缓存。Winner 解释说:“Web 高速缓存所做的是对文件进行压缩和高速缓存,为您提供巨大的性能增益 — 在我见过的某些情况中达到 200%,而我们发现通常使用 Web 高速缓存的服务器比没有使用它的服务器的容量多 50% 到 100%。因此,利用一个 Oracle 应用服务器和 Web 高速缓存集群 — 以及利用它们创建规则的丰富功能 — 您能够充分地提高性能,而不必投资购买更多的硬件。”
Winner 坚信,高速缓存将成为 Web 应用程序中的标准。他说:“在某些方面,它已经是标准了。但是根据现在应用程序的要求,为了总体性能和高可用性,对您当即需要的文档和进程进行高速缓存的能力变得越来越重要。”
尽管 Winner 建议为实际上任何的应用程序进行高速缓存,他也注意到在某些情况下可能不能选择压缩。“如果您的亚洲用户运行 Netscape 4.76,则您在使用压缩时会出现问题 — 但是如果您的用户的高技术人员运行 1990 年代或更高的浏览器版本,则您会获得相当好的性能。我可以说,我没有见过任何解决方案和应用程序不会受益于高速缓存,即使您只是对 JSP 进行高速缓存。您可以将高速缓存打开再关闭,很容易看到它对性能的影响程度。”
基于使用 Web 高速缓存的经验,Winner 提供了以下提示,以便使您从高速缓存中获得最大限度的性能增益:
仅仅使用您需要的 Oracle 应用服务器的服务。例如,在 Web 服务器配置中,去掉所有在启动时默认不需要的服务。
查看应用程序层,确保将 Web 高速缓存作用于页面上运行的所有内容 — 包括所有的文件格式(JSP、HTML、PL/SQL)和图像。
为您的特定环境创建合适的高速缓存规则。
平衡 HTTP 和 OracleAS 的 J2EE 容器 (OC4J) 请求,将这两种请求分别置于不同的服务器或不同的集群中。
在 Web 服务端和数据库中尽可能多地使用集群 — 您确实需要使用 RAC 来集群您的数据库。
集群或者失败 Winner 注意到,集群已经成为其团队的一个标准选项,用于查看他们在不同节点上运行服务器时,何时没有获得足够的性能和可用性。“首先我们通过升级到 RAC,对数据库进行集群,然后我们知道需要集群 Web 服务,以便在 Web 服务端提高可用性。随后我们开始查看关于 Java 和 Apache 的集群,发现 OC4J 容器集群和 Apache 集群提供了巨大的优势。”
Winner 说公司选择升级到 RAC 有几个原因。“我们对真正应用集群进行了一些研究,确定我们的最佳选择是在 Oracle RAC 上使用 Veritas 来运行它。我们的一部分目标是扩展我们的生产环境,以减少某些维护成本,并提供对产品更加实时的数据访问。我们还希望能够在实际的文档访问定义 (DAD) 或统一资源定位器 (URL) 级别上提供应用程序的集群,因此我们能够根据用户的地理区域或用户使用的应用程序,为用户提供多种选择。RAC 允许我们分离特定的功能 — 无论是根据实例、位于 RAC 集群中还是根据应用程序级的实际 URL/DAD 集群 — 因此它就是一种功能非常强大的产品。”RAC 对那些添加到集群中的故障切换的利用能力也是决策中的一个重要因素“它使我们能够在多个服务器上存储 Java 容器,因此我们可以在集群中分布这些应用程序的负载,以便获得更高的可用性。2003 年,我们用开发人员套件开发了第一批基于 Java 的应用程序并将其投入运行,而这打开了一个全新的技术领域,其运行速度要快得多。JSP 页的性能与 PL/SQL 页相比 — 简直是天壤之别!PL/SQL 是经过验证的,并且它仍是我们很主要的业务,但是它们之间无法相比。使用 Web 高速缓存和 JSP,它是速度快得多的引擎。而 Oracle 的 OC4J 为我们提供了无数可以做的事情。”
紧跟代码 尽管系统设计和产品的选择在开发具有可伸缩性的高性能应用程序方面非常重要,Winner 的团队从未忽视代码本身在保持日常基本工作的高性能方面的重要性。如果对代码的需求经常改变,保持程序正常运行就非常困难。
他断言:“性能问题从代码级开始。问题不在服务器、Web 服务器或者数据库 — 而在于代码。与每层的优调一样重要,性能的底线是代码:从连接池、SQL 和 JDBC 到特定数量的代码如何实际运行的所有问题 — 包括 PL/SQL 属性和 Java 资源。以我的观点来看,代码绝对是我们最大的问题。监视和防止错误可不是件容易的工作,特别是当您有数万行代码正在更改的时候。”
在 George P. Johnson 公司,代码维护的标准挑战由于其代码需要适应各种各样的客户和地区而变得复杂 — 一个例子是最近启用的 Oracle World China 站点,它具有地区专用的特点以及在 JSP 中运行的全中文字符集。
Winner 指出:“我们不是那种构建一个版本并把它放在磁盘上再发送出去的公司。我希望我们能够制作压缩打包的软件,但是 在我们的行业里,这不可能发生 — 这意味着版本控制是我们的一个主要问题。我们的服务器随着运行的越来越多的新代码而不断地扩展,而我们正在进行大量的编译。我们能够审计和跟踪代码的变化并快速确定运行状况不良的过程,这极为重要,这样我们就能够根据需要进行重新编译或重新部署。”
他的公司对于保持版本控制的策略的一部分是,从基本上在一个实例上运行的一个核心应用程序开始工作。
Winner 解释说:“我们主要拥有一个 Unicode 产品实例 AL32UTF8,而且我们拥有一个基本的产品,不希望为每个客户而更改它。当然,我们会有客户专用的 HTML 以及类似的东西 — 对于每个公司而言,前端和用户界面都是专有的,这是处理公司特有营销活动和业务需求的逻辑 — 但是就核心代码而言,它并没有改变。我们的应用程序的静态和一致性逻辑深入到