`

设计Web应用程序时要注意可伸缩性

阅读更多

Max Indelicato是一位软件开发主管和前首席软件架构师,他最近发表了一篇关于如何设计具备可伸缩性的web应用程序 的文章。他提出要选择正确的部署和存储解决方案,选择可伸缩的数据存储和模式,并且使用抽象层。

适合工作的工具

Indelicato的第一个建议是“为工作选择正确的工具”,想要达到这个目的,就要选择下列架构解决方案中的一种:

  • 使用云部署解决方案
  • 使用可伸缩的数据存储解决方案,像MongoDB、CouchDB、Cassandra或者Redis。
  • 添加高速缓存层,像Memcached。

他认为在开始开发应用程序的时候,这些解决方案并不是必须的,但是在开始时就选择可伸缩的数据存储解决方案是很明智的,因为那会避免之后再进行切 换。将应用程序部署到云中会为我们带来一些好处,特别是对于创业公司来说,因为他们无法准确地确定他们的应用程序在启用之后会有多少人使用。将应用程序部 署到云中之后,当需求增加时,就可以让应用程序以优雅的方式进行伸缩。很多软件架构师都讲述了他们不得不对应用程序进行扩展的事件,其中他们会引入高速缓 存层,那会解决大部分问题。但是我们应该在设计阶段就考虑相应的解决方案。 这样在之后就很容易实现了。

可伸缩的数据存储

接下来,Indelicato建议选择支持分区、复制并且有弹性的数据存储,包括以下几种: MongoDB、Cassandra、Redis、Tokyo Cabinet、Project Voldemort,或者选择MySQL作为关系型数据库。这是很必要的,因为不管怎样,在应用程序的生命周期中,分区都是必要的。对于可伸缩性来说,分 区并不是必需的,但是对于“确保高可用性”就是必需的。灵活性可以让我们快速地增加更多的节点,这可能是出现流量峰值的时候,也可能是“由于硬件故障或升 级、大型的伸缩模式的变更或者任何需要让节点下线的情况下,需要对节点进行维护的时候。”

可伸缩的数据模式

Indelicato建议创建一种模式,从而让我们可以很容易地进行数据sharding,他还给出了下面的临时组件的例子,User和UserFeedEntry:

Collection (or Table, or Entries, etc) User
{
    UserId : guid, unique, key
    Username : string
    PasswordHash : string
    LastModified : timestamp
    Created : timestamp
}

Collection (or Table, or Entries, etc) UserFeedEntry
{
    UserFeedEntryId : guid, unique, key
    UserId : guid, unique, foreign key
    Body : string
    LastModified : timestamp
    Created : timestamp
}

然后他建议根据UserId进行分区:

通过根据UserId字段对User集合和UserFeedEntry集合分区,我们会将两种相关的数据块放在同一个节点上。所有UserId为 xxx-xxx-xxx-xxx的UserFeedEntry数据和UserId为xxx-xxx-xxx-xxx的User数据会被包含在同一数据片段 中。

为什么这是可伸缩的呢? 因为我们对于这个应用程序的需求完全是针对数据的分发的。当每个访问者访问User的信息页面时,系统会向数据片段发出请求以获取User栏显示用户的详 细信息,然后再向同一个数据片段发出请求以获得用户的UserFeedEntries。这两个请求中,一个会获得一条数据,而另一个会获得多条数据,而这 些数据都包含在同一数据片段中。 假设在一天之中对大多数用户的信息都有相同次数的访问,那么我们已经设计了可伸缩的模式,它会支持我们的web应用程序的需求。

使用抽象层

Indelicato的最后一条建议是使用下述抽象层中的一种,但不仅限于这些: 元数据库(Repository)、缓存和服务。当创建元数据库层的时候,他建议:

  1. 不要以针对你所抽象的数据存储特有的方式来为方法命名。 例如,如果你抽象的是关系型的数据库,一般我们会为了执行SQL查询和命令而定义Select()、Insert()、Delete()、 Update()函数。不要这么做。 相反,应该让你的函数名不那么专门化,可以使用Fetch()、Put()、Delete()和Replace()。这会确保你更好地遵循元数据库模式, 并且当你需要切换底层数据库的时候,工作会更简单。
  2. 如果可能的话使用接口(或者抽象类等等) 将这些接口传递给应用程序中更高的层,这样你永远不会直接引用元数据库的特定的固有实现。这对于构建和单元测试也是非常棒的,因为你可以编写其他固有实现,它们会预先带有与测试案例相关的数据。
  3. 将所有针对存储的特殊代码封装到一个类(或者模块等等)中,真正的元数据库会引用或者继承它。只在每个函数中放置针对存取函数所必需的细节(查询语句等等)。
  4. 时刻要牢记,并非所有元数据库都需要抽象相同的数据存储解决方案。只要你愿意,你可以将User存储在MySQL中,而将 UserFeedEntries存储在MongoDB中,元数据库要以这样的方式实现,它们支持这么做而不需要付出太多代价。之前的三点建议也间接地有助 于我们做到这一点。

Indelicato说,对于高速缓存层,在开始时他经常会使用“简单的页面(或者视图等等)级别的缓存或者服务层的缓存,因为这是两个不会经常发生状态变更的区域。”

Indelicato认为需要对服务层进行足够的抽象,这样当需求增加时,我们可以很容易地从服务的内部实现切换到进程之外的实现。

有些人认为在构建应用程序的时候不需要考虑可伸缩性问题,因为那会在必要的时候得到强调。 但是如果我们想要从开始就考虑可伸缩性,你还有什么好的建议呢?

 

查看英文原文: Designing a Web Application with Scalability in Mind

 

原文:http://www.infoq.com/cn/news/2010/09/Scalable-Web-Application

分享到:
评论

相关推荐

    构建可伸缩的web应用

    如何在创业之初,就构建好适合业务长远发展的技术架构:以不变应万变、以可伸缩性对抗变化莫测的业务需求,为自己的发展赢得时间、为产品创造优秀的用户体验?本书针对此痛点,给出了适切中肯的建议。 作者深入阐述...

    MySQL用户希望产品更具伸缩性

    被频繁提出的问题(占33%)是产品的可伸缩性,接下来是可维护性(23%),可用性(17%)和吞吐量(15%)。超过70%的被访问者说他们宁愿一个简单的可定制的应用程序也不愿意使用需要不同组件的客户解决方案。被调查者...

    参考:用于构建可伸缩,可维护和高性能的Web应用程序的样板

    REF是一个React-Express-Firebase项目模板(又名样板),用于构建可扩展,可维护和高性能的Web应用程序。 这个样板非常适合初学者 :baby: 中级 :man: 和高级开发人员 :construction_worker: 希望快速启动一个将产生...

    Ajax和REST之1:Ajax REST架构风格对于融入式Web

    本文讨论了对于那些需要动态和个性化的用户界面,同时又要求可伸缩性的Web应用程序来说,Ajax/REST 架构风格可能带来的好处。给定这些需求之后,我解释了为什么相对于传统的服务器端Web应用程序架构风格来说,Ajax/...

    用 C# Builder 开发 DB2 Web 应用程序的5条性能法则

    速度和可伸缩性是 Internet 开发的基本要求,并且它们并不总是难于达到的,仅仅是通过应用一些简单的法则,便可以使 Internet 应用程序的速度从慢变快。在本文中,您将学习使用 Borland® C#BuilderTM 和 IBM® DB2...

    firefly:Firefly是用于快速开发高性能Web应用程序的异步Web框架

    使用Kotlin协程,Firefly确实是异步的并且具有高度可伸缩性。 它充分利用了硬件的潜力。 使用无阻塞开发的强大功能,而不会产生回调噩梦。 Firefly核心为以下功能提供功能: TCP客户端和服务器 HTTP客户端和...

    MVC架构在工程项目管理系统中的应用

    建具有可伸缩性、灵活性、易维护性的企业商务系统 提供了良好的机制。我们将MVC (Model- View- Controller) 开发模型应用于.NET 平台上, 采用了进行系统 设计, 成功开发出一套工程管理系统。通过这种开发 模式的应用...

    C#程序设计(最新的培训教材)

    .NET框架是建立、配置和运行Web服务以及应用程序的多语言环境,是Microsoft的新一代Web应用程序开发平台,是.NET平台最关键的部分。它包含以下两个主要部分。 (1)通用语言运行库(Common Language Runtime—CLR) ...

    使用ETags减少Web应用带宽和负载第1/2页

    本文中,我们将探究一个可被Web开发者利用的、鲜为人知的工具,不引人注意的“ETag响应头(ETag Response Header)”,以及如何将它集成进基于Spring和Hibernate的动态Web应用,以提升应用程序性能和可伸缩性。...

    ASP.NET v2.0入门经典中英文 源码(DOC) ASP.NET.rar

    ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是ASP.NET 2.0初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从初版、...

    net 2.0 高级编程第4版 part 1

    ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是ASP.NET 2.0初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从初版、...

    WeBoil:Web应用程序样板(WeBoil)

    WeBoil是我的kickstarter 工具,使用了 , , 和 ,在设计时考虑了可伸缩性和性能。 工作流程 WeBoil工作流程是通过自动化和增强的,提供了Sass文档生成器,CSS Autoprefixing,JSHint,SCSS linter,minimum CSS...

    《Java-web程序设计》教案.doc

    强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器 进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数 台服务器,Java显示了一个巨大的生命力。 多样化...

    go-gen:用于Web应用程序代码生成的CLI

    go-gen是用于Web应用程序代码生成的工具。 它根据用户需求生成代码,这些代码可以作为输入形式以文件的形式传递给命令。 Go-gen的目标是减少模板代码的开发时间,同时允许可读性,可伸缩性和可测试性。 没有外部...

    ASP科研信息管理系统设计

    (1) 分析了asp开发平台的体系结构及关键技术,认为在asp平台基础上开发三层架构的Web应用程序具有可管理性、可伸缩性好、可重用性好,易于构建等优点,决定采用asp作为系统的开发平台。 (2) 用面向对象和组件化开发...

    MFlow:(Haskell)具有状态,类型安全的用户交互和窗口小部件组合器的Web应用程序服务器

    请参阅 流 MFlow是一个Web框架,可以将处理程序和配置文件中混乱的Web编程转换为理智的常规编程。 您的代码是网站。 MFlow Web应用程序非常... 对于可伸缩性敏感的应用程序,不需要其他基于延续的框架来满足这两个先前

    《ASP.NET.2.0.入门经典(第4版)》[源代码]

    ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。 本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是 ASP.NET初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从...

    JavaEE迎合Web2.0

    本文内容包括:JavaEE原理和设想Web2.0带来的巨变延迟问题异步方法一般解决方案特定于Servlet或特定于I/O的API结束语参考资料如果Web2.0应用程序使用的是基于标准的Java...,那么将会面临着严重的性能和可伸缩性问题...

    gts:AppScale是易于管理的无服务器平台,用于在任何基础架构上构建和运行可伸缩的Web和移动应用程序

    AppScale GTS AppScale GTS是一个开放源代码的无服务器平台,用于在任何基础架构上构建和运行可伸缩的Web和移动应用程序。 该平台使开发人员可以完全专注于业务逻辑,以便快速构建可扩展的应用程序,将其与部署和...

    基于JSP的儿童健康保健系统毕业设计论文

    基于J2EE 体系结构的企业级应用发开越来越受到企业开发的青睐,J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构,J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供...

Global site tag (gtag.js) - Google Analytics