- 浏览: 305829 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
完善自我:
支持一下!
揭秘IT人才特点:中美印日四国程序员比较 -
悲剧了:
好文,看玩thinking in java的提到的异常处理,看 ...
高效的Java异常处理框架(转) -
yin_bp:
开源框架bbossgroups页支持组件异步方法调用哦,详情请 ...
Spring 3中异步方法调用 -
flyjava:
sun的悲哀
Apache怒了,威胁说要离开JCP
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认为需要对服务层进行足够的抽象,这样当需求增加时,我们可以很容易地从服务的内部实现切换到进程之外的实现。
有些人认为在构建应用程序的时候不需要考虑可伸缩性问题,因为那会在必要的时候得到强调。 但是如果我们想要从开始就考虑可伸缩性,你还有什么好的建议呢?
查看英文原文: Designing a Web Application with Scalability in Mind
原文:http://www.infoq.com/cn/news/2010/09/Scalable-Web-Application
发表评论
-
Web编程是函数式编程
2010-11-30 13:44 1031任何一位在两个领域里 ... -
如何开发Web应用程序
2010-11-30 13:41 1068这是一个经常被问到的 ... -
Web 2.0应用客户端性能问题十大根源
2010-11-25 20:19 995Web 2.0应用的推广为用户带来了全新的体验,同时也让开 ... -
HTML压缩(JSP的GZIP实现)
2010-11-24 22:31 4902HTTP 压缩可以大大提高浏览网站的速度,它的 ... -
浏览器加载和渲染html的顺序
2010-11-22 09:45 25111.浏览器加载和渲染html的顺序 1、IE下载的顺序是从上到 ... -
在服务端合并和压缩JavaScript和CSS文件
2010-11-22 09:16 1094Web性能优化最佳实践中最重要的一条是减少HTTP请求 ... -
用 YUI Compressor 压缩和混淆 JS 和 CSS
2010-11-22 09:05 2304一、简介: 目前开发Web应用Javas ... -
如何缓存DWR生成的JS文件
2010-11-18 17:37 1935DWR provides a convenient mec ... -
HTTP状态一览
2010-11-17 22:43 743在网站建设的实际应用中,容易出现很多小小的失误,就像m ... -
两款HTTP流量分析工具的比较:HTTP Watch,Fiddler
2010-11-17 17:26 0做Web开发或者Web分析经常需要查看Http通讯的过程, ... -
了解CSS的查找匹配原理,让CSS更简洁、高效
2010-11-17 16:49 0用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知 ... -
高性能WEB开发 - flush让页面分块,逐步呈现
2010-11-17 16:47 0在处理比较耗时的请求的时候,我们总希望先让用户先 ... -
WEB高性能开发 - 疯狂的HTML压缩
2010-11-17 16:46 0前言: ... -
该如何加载google-analytics(或其他第三方)的JS
2010-11-17 16:44 0很多网站为了获取用户访问网站的统计信息,使用了go ... -
高性能WEB开发 - 页面呈现、重绘、回流。
2010-11-17 15:57 0页面呈现流程 在讨论页面重绘、回流之前。需要 ... -
高性能WEB开发 - JS、CSS的合并、压缩、缓存管理
2010-11-17 15:54 0本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存 ... -
高性能WEB开发- 减少请求,响应的数据量
2010-11-17 15:49 0上一篇中我们说 ... -
高性能WEB开发 - 为什么要减少请求数,如何减少请求数!
2010-11-17 15:42 0http请求头的数据量 我们先分析下 ... -
高性能web开发 - 如何加载JS,JS应该放在什么位置?
2010-11-17 15:39 0外部JS的阻塞下载 所有浏览器在下载JS的时候, ... -
Web缓存教程
2010-11-17 15:08 1425原文(英文)地址: http://www.mnot.n ...
相关推荐
如何在创业之初,就构建好适合业务长远发展的技术架构:以不变应万变、以可伸缩性对抗变化莫测的业务需求,为自己的发展赢得时间、为产品创造优秀的用户体验?本书针对此痛点,给出了适切中肯的建议。 作者深入阐述...
被频繁提出的问题(占33%)是产品的可伸缩性,接下来是可维护性(23%),可用性(17%)和吞吐量(15%)。超过70%的被访问者说他们宁愿一个简单的可定制的应用程序也不愿意使用需要不同组件的客户解决方案。被调查者...
REF是一个React-Express-Firebase项目模板(又名样板),用于构建可扩展,可维护和高性能的Web应用程序。 这个样板非常适合初学者 :baby: 中级 :man: 和高级开发人员 :construction_worker: 希望快速启动一个将产生...
本文讨论了对于那些需要动态和个性化的用户界面,同时又要求可伸缩性的Web应用程序来说,Ajax/REST 架构风格可能带来的好处。给定这些需求之后,我解释了为什么相对于传统的服务器端Web应用程序架构风格来说,Ajax/...
速度和可伸缩性是 Internet 开发的基本要求,并且它们并不总是难于达到的,仅仅是通过应用一些简单的法则,便可以使 Internet 应用程序的速度从慢变快。在本文中,您将学习使用 Borland® C#BuilderTM 和 IBM® DB2...
使用Kotlin协程,Firefly确实是异步的并且具有高度可伸缩性。 它充分利用了硬件的潜力。 使用无阻塞开发的强大功能,而不会产生回调噩梦。 Firefly核心为以下功能提供功能: TCP客户端和服务器 HTTP客户端和...
建具有可伸缩性、灵活性、易维护性的企业商务系统 提供了良好的机制。我们将MVC (Model- View- Controller) 开发模型应用于.NET 平台上, 采用了进行系统 设计, 成功开发出一套工程管理系统。通过这种开发 模式的应用...
.NET框架是建立、配置和运行Web服务以及应用程序的多语言环境,是Microsoft的新一代Web应用程序开发平台,是.NET平台最关键的部分。它包含以下两个主要部分。 (1)通用语言运行库(Common Language Runtime—CLR) ...
本文中,我们将探究一个可被Web开发者利用的、鲜为人知的工具,不引人注意的“ETag响应头(ETag Response Header)”,以及如何将它集成进基于Spring和Hibernate的动态Web应用,以提升应用程序性能和可伸缩性。...
ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是ASP.NET 2.0初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从初版、...
ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是ASP.NET 2.0初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从初版、...
WeBoil是我的kickstarter 工具,使用了 , , 和 ,在设计时考虑了可伸缩性和性能。 工作流程 WeBoil工作流程是通过自动化和增强的,提供了Sass文档生成器,CSS Autoprefixing,JSHint,SCSS linter,minimum CSS...
强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器 进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数 台服务器,Java显示了一个巨大的生命力。 多样化...
go-gen是用于Web应用程序代码生成的工具。 它根据用户需求生成代码,这些代码可以作为输入形式以文件的形式传递给命令。 Go-gen的目标是减少模板代码的开发时间,同时允许可读性,可伸缩性和可测试性。 没有外部...
(1) 分析了asp开发平台的体系结构及关键技术,认为在asp平台基础上开发三层架构的Web应用程序具有可管理性、可伸缩性好、可重用性好,易于构建等优点,决定采用asp作为系统的开发平台。 (2) 用面向对象和组件化开发...
请参阅 流 MFlow是一个Web框架,可以将处理程序和配置文件中混乱的Web编程转换为理智的常规编程。 您的代码是网站。 MFlow Web应用程序非常... 对于可伸缩性敏感的应用程序,不需要其他基于延续的框架来满足这两个先前
ASP.NET 2.0的目标是提高开发人员的效率、改善应用程序的性能和可伸缩性。 本书全面介绍了ASP.NET 2.0的新特性和各方面的编程知识,是 ASP.NET初学者以及想了解ASP.NET 2.0新技术的读者的理想参考书。该书从...
本文内容包括:JavaEE原理和设想Web2.0带来的巨变延迟问题异步方法一般解决方案特定于Servlet或特定于I/O的API结束语参考资料如果Web2.0应用程序使用的是基于标准的Java...,那么将会面临着严重的性能和可伸缩性问题...
AppScale GTS AppScale GTS是一个开放源代码的无服务器平台,用于在任何基础架构上构建和运行可伸缩的Web和移动应用程序。 该平台使开发人员可以完全专注于业务逻辑,以便快速构建可扩展的应用程序,将其与部署和...
基于J2EE 体系结构的企业级应用发开越来越受到企业开发的青睐,J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构,J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供...