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)、缓存和服务。当创建元数据库层的时候,他建议:
- 不要以针对你所抽象的数据存储特有的方式来为方法命名。
例如,如果你抽象的是关系型的数据库,一般我们会为了执行SQL查询和命令而定义Select()、Insert()、Delete()、
Update()函数。不要这么做。
相反,应该让你的函数名不那么专门化,可以使用Fetch()、Put()、Delete()和Replace()。这会确保你更好地遵循元数据库模式,
并且当你需要切换底层数据库的时候,工作会更简单。
- 如果可能的话使用接口(或者抽象类等等) 将这些接口传递给应用程序中更高的层,这样你永远不会直接引用元数据库的特定的固有实现。这对于构建和单元测试也是非常棒的,因为你可以编写其他固有实现,它们会预先带有与测试案例相关的数据。
- 将所有针对存储的特殊代码封装到一个类(或者模块等等)中,真正的元数据库会引用或者继承它。只在每个函数中放置针对存取函数所必需的细节(查询语句等等)。
- 时刻要牢记,并非所有元数据库都需要抽象相同的数据存储解决方案。只要你愿意,你可以将User存储在MySQL中,而将
UserFeedEntries存储在MongoDB中,元数据库要以这样的方式实现,它们支持这么做而不需要付出太多代价。之前的三点建议也间接地有助
于我们做到这一点。
Indelicato说,对于高速缓存层,在开始时他经常会使用“简单的页面(或者视图等等)级别的缓存或者服务层的缓存,因为这是两个不会经常发生状态变更的区域。”
Indelicato认为需要对服务层进行足够的抽象,这样当需求增加时,我们可以很容易地从服务的内部实现切换到进程之外的实现。
有些人认为在构建应用程序的时候不需要考虑可伸缩性问题,因为那会在必要的时候得到强调。 但是如果我们想要从开始就考虑可伸缩性,你还有什么好的建议呢?
转自:http://www.infoq.com/cn/news/2010/09/Scalable-Web-Application
分享到:
相关推荐
如何在创业之初,就构建好适合业务长远发展的技术架构:以不变应万变、以可伸缩性对抗变化莫测的业务需求,为自己的发展赢得时间、为产品创造优秀的用户体验?本书针对此痛点,给出了适切中肯的建议。 作者深入阐述...
综上所述,ASP.NET Web应用程序开发是一个涉及广泛技术和工具的领域,涵盖从设计、编码、测试到部署的全过程,旨在帮助开发者构建高效、安全且具有高度可伸缩性的Web应用。通过学习和掌握这些知识点,开发人员能够在...
9. **弹性云服务**:公有云提供商如AWS、Azure和Google Cloud提供弹性的计算资源,可根据需求自动调整,为Web应用提供了强大的可伸缩性支持。 10. **代码优化**:最后但同样重要的是,编写高效、优化的代码,减少...
在可伸缩性方面,WAFer可能提供了线程池、异步I/O或者其他并发模型来适应不同规模的应用场景。 总的来说,WAFer是一个专为C/C++开发者设计的Web应用框架,它提供了构建高性能Web服务所需的基本工具和机制。通过深入...
### 亚马逊部署Web应用程序知识点详解 #### 一、AWS Elastic Beanstalk **AWS Elastic Beanstalk** 是亚马逊提供的一种简化Web应用程序部署的服务。它允许开发者快速地在云端部署和管理应用程序,而无需关心底层...
《Web程序设计(第2版)》是一本深入探讨Web应用程序开发的专业教材,适用于初学者和有一定基础的学习者。此书全面覆盖了Web编程的基础知识和技术,旨在帮助读者理解和掌握构建动态、交互式Web应用的核心技能。课程...
网站设计与Web应用开发技术是一门综合性的课程,涵盖了从网页设计基础到复杂Web应用程序的构建等多个方面。这门课程的电子教案和课后答案旨在帮助学生深入理解并掌握相关知识,通过实践来提升技能。 1. **HTML与CSS...
本文的主要贡献是在Web应用中,JSP技术和JavaBean组件的结合可以提高Web应用的开发与执行效率,缩短了开发时间,同时提高了Web应用的可伸缩性。同时,本文还讨论了JSP技术在BS模式下的应用,包括JSP动态网页技术、...
《Web程序设计》第二版是由吉根林主编的一本深入探讨Web开发的教材,它涵盖了Web应用程序设计的基础知识、核心技术以及高级应用。本电子教案旨在为学习者提供一个全面、系统的教学资源,帮助他们掌握Web编程的核心...
Tomcat 是 Java Servlet 容器,支持 Java Web 应用程序,具有可扩展性和灵活性。 基于响应式设计和客户端技术的 Web 应用服务器 响应式设计是一种使 Web 页面能够适应不同屏幕尺寸的设计方法。基于响应式设计的 ...
ASP.NET Core 和 Azure 的组合是现代 Web 应用程序开发的首选平台,尤其适用于寻求跨平台支持、微服务架构、Docker 容器化、高性能和可伸缩性的项目。微软的 ASP.NET Core 6.0 作为一个轻量级、高性能的框架,针对...
这种解耦设计也能提高系统的可伸缩性和可靠性。 总的来说,理解并适当地处理Azure Web应用的4分钟空闲连接限制是优化服务性能和提升用户体验的关键。开发者应当根据应用的需求选择合适的处理策略,如异步处理或利用...
ADO.NET 的设计允许应用程序在不保持活动连接的情况下处理大量数据,从而显著提高了性能和可伸缩性。 #### 三、ASP.NET 下 Web 应用程序的关键技术 在 ASP.NET 环境下,Web 应用程序开发涉及多项关键技术: 1. **...
RESTful API设计不仅简洁且易于理解,还提供了良好的可伸缩性和可维护性。本篇文章将深入探讨如何使用多层体系结构来构建REST风格的Web服务和动态Web应用程序。 首先,理解REST的基本原则至关重要。REST是一种基于...
这一转变使得开发者能够构建更具交互性和动态性的Web应用,同时利用服务器端的计算资源,提高了应用程序的性能和可伸缩性。 .NET框架包括几个关键组成部分,如Common Language Runtime(CLR)和.NET Framework ...
* 强大的可伸缩性。从只有一个小的 Jar 文件就可以运行 Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台 Application 进行事务处理和消息处理,一台服务器到无数台服务器,Java 显示了一个巨大的生命力。 * ...
ASP.NET Web应用系统项目开发是基于微软的.NET框架构建高效、安全且可伸缩的Web应用程序的方法。在本文中,我们将深入探讨ASP.NET Web应用系统的各个关键知识点,以及如何通过项目开发来提升技能。 首先,ASP.NET是...
这些基础知识对于构建高效、可扩展的web应用程序至关重要。 二、数据库管理 在web开发中,数据库用于存储和检索数据。常见的关系型数据库有MySQL、PostgreSQL,非关系型数据库如MongoDB则常用于处理半结构化或非...
分布式 web 技术是指将 web 应用程序分布式部署在多个服务器上,以提高系统的可用性、性能和可扩展性。以下是分布式 web 技术的关键知识点: 1. 分布式 web 框架的概述:分布式 web 框架是指将 web 应用程序分布式...