HYXT Blog

we produce valuable software for K12.
clock February 4, 2009 18:22 by author Sky Jia (贾超)

The software/enterprise architect job is an important one. The duties of an architect are numerous and require specific leadership, communication and technical skills to be fulfilled.

In a recent post, Gabriel Morgan wrote about the qualities of an enterprise software architect starting from Daniel Goleman's Emotional Intelligence (EI) abilities: Self-Awareness, Self-Management, Social Awareness and Relationship Management.

Self-Awareness

  • Emotional self-awareness
  • Accurate self-assessment

Self-Management

  • Self-control
  • Transparency
  • Adaptability
  • Achievement
  • Initiative
  • Optimism

Social Awareness

  •     Empathy
  •     Organizational awareness
  •     Service

Relationship Management

  •     Inspiration
  •     Influence
  •     Developing others
  •     Change catalyst
  •     Conflict management
  •     Teamwork and collaboration

The Software Engineering Institute has collected a large number of opinions regarding the duties, the skills and the knowledge of a software architect as seen by various software engineers. A few of the opinions regarding an architect’s required skills are:

David Cornish (Technical Architect, JPMorgan, London, UK):

Strong communication with both technical and business teams 
Strong design experience and technical knowledge 
Analytical and 'joined-up' thinking 
Conflict resolution

Theo Gantos (Consultant, TEKA, Flint, MI, USA):

A renaissance person. Consulting, diplomacy, organization, conceptualization, abstract thinking, logical reasoning, data modeling skills in several methodologies, ability to self-evaluate and adapt quickly, presentation and communication skills, programming expertise, writing skills, sales skills, charisma, finance and return on investment calculation skills, dealing with difficult and change-resistant people, sense of humor.

Venkatesh Krishnamurthy (Technical Architect, Valtech India, Bangalore, KA, India):

  • Creative
  • An Artist
  • Politician
  • Strong willed
  • Excellent communication skills
  • Excellent presentation skills
  • People person
  • Matured
  • Articulative
  • Courageous to make decisions and stand by it
  • Risk taker
  • Good observer
  • Negotiator

Victor Alejandro Baez Puente (Chief Technology Officer, Grupo Nacional Provincial, Mexico City, DF, Mexico):

  • Experience designing an enterprise application with financial auditing, contract management, enterprise workflow, business process integration, and perhaps asset management components
  • Experience with Service Oriented Architecture (SOA).
  • Experience as a chief architect on inception-to-delivery of J2EE projects.
  • Experience with deploying J2EE rich and/or web client applications in a high-availability, clustered environment
  • Expertise in the Unified Modeling Language (UML) for constructing, and documenting the artifacts of software systems
  • Exemplary general IT knowledge (applications development, testing, deployment, operations, documentation, standards, best practices, security, hardware, networking, OS, DBMS, middleware, etc.)
  • Expertise and experience in lightweight, rapid development, agile methodologies.
  • Experience in estimating and measuring project velocity
  • Experience with interaction with legacy systems and phased application integration
  • Exquisite attention to detail
  • Written, verbal, and diagrammatic communication skills

The examples are numerous. Some put an emphasis on leadership/communicator skills while others take specific technical skills into account. What is your opinion on the skills required of a software/enterprise architect?


clock December 1, 2008 23:01 by author Sky Jia (贾超)

clock November 24, 2008 17:46 by author Sky Jia (贾超)

作者 Steven Haines译者 崔康 发布于 20081110下午94

企业java应用的性能调优是一项艰巨的、有时甚至是徒劳的任务,这是由现代应用的复杂性和缺少正规的调优方法导致的。现代企业应用与十年前的应用相比差距很大,如今这些应用支持多输入、多输出、复杂的框架和业务处理引擎。而十年之前,基于web的企业应用只是通过网络浏览器获得输入信息,然后与数据库或者遗留系统交互进行后台处理,最后把输出结果返回给浏览器(HTML)。现在,输入信息可以来自HTML浏览器、富客户端、移动设备或者网络服务,它可以跨越运行在不同架构下的servlets或者门户容器,这反过来又可能调用企业bean,外部web服务或者把处理委托给业务规则引擎。每一个这样的组件都可能与内容管理系统、缓存层、众多数据库和遗留系统交互。输出的信息通常以独立于展现层的形式保存,随后转化为HTMLXMLWML或者其他任意客户端需要的格式。现代应用比过去包含更多移动部分和"黑盒子",这对性能调优提出了巨大的挑战。

除了复杂性提高,性能调优技术其艺术性要大于科学性,还因为大多数性能调优指南都侧重于性能指标,有时晦涩难懂,也可能影响用户体验。本文尝试把性能调优活动变成一种"科学"范畴内的行为,提供了一种可重用的关注用户体验的方法,利用"等待点"(也就是应用中引起某请求等待的部分)分析应用架构。总之,基于等待的调优方法允许性能工程师们通过优化用户体验快速实现可度量的性能提高。

性能调优过程

在详细介绍基于等待调优和等待点分析方法之前,本节首先对有效的性能调优过程做一个概述。性能调优可以简单的概括为四步:

  1. 负载测试
  2. 容器调优
  3. 应用调优
  4. 迭代

像大多数计算机科学一样,性能调优是一个迭代的过程。首先,创建一个合适的负载测试,其中包含了均衡的、具有代表性的服务请求,这都是容器调优实践可以满足的。随着容器被不断调优和测试压力的增大,应用程序的瓶颈逐渐显现出来。随着应用的瓶颈被定位和解决,应用行为会发生变化,这就要求容器再次调优。在容器和应用之间的迭代过程会一直进行到性能到达可以接受的条件(或者直到项目已经到期必须发布时)。

负载测试方法

启动一个性能调优实践的先决条件是创建一整套合适的负载测试集合。每一个负载测试必须满足以下两点:

  • 代表性,必须体现最终用户的业务场景(或期望的场景)
  • 均衡性,必须符合最终用户不同行为的比例分配

也就是说,负载必须能够按照最终用户的实际操作比例来模拟用户动作。为了说明均衡最终用户动作的重要性,请看下面这个例子:在保险索赔部门,员工执行以下操作:

  1. 用户上午八点登陆系统。
  2. 上午每人平均处理五个索赔请求。
  3. 大约80%的用户忘记在吃饭之前注销账号,导致session过期。
  4. 午饭后,用户重新登录系统。
  5. 下午每人平均处理五个索赔申请。
  6. 下班之前生成两个报告。
  7. 80%的用户回家前注销账号。

这个例子是一个真实应用的简化版,但是它足够在这些服务请求建立一个平衡。这个场景展现的均衡是:两次登陆,十次索赔处理,两次报告和一次注销。

如果负载生成器把压力均匀分布在不同的服务请求上又会怎么样呢?在本例中,用户登陆和注销功能会接收与处理与理赔请求相同的负载。如果是1000个并发用户,登陆功能会很快崩溃,导致企业投资建立一个能够处理这种负载的登陆组件,而实际上这种负载根本不会发生。更糟糕的是,本例中由于最大的瓶颈看似存在于登陆功能上,所以调优的努力会侧重该功能,而忽视索赔处理功能。总之,一个非均衡的负载可能导致调优过程错误的关注于支持那些绝不会发生的负载的组件,而不是那些真正需要调优的部分!

判断一个负载对于应用是均衡的和代表性的标准,对于测试一个已存在的应用(或者一个新版本)还是一个全新的应用是不同的。

已存在应用

已存在应用跟一个全新应用相比,一个明显的优点是:真实的用户行为可以在实际生产环境中观察获得。根据请求的本质和它们如何被应用定义,可以通过两个选择定义最终用户行为:

  • 访问日志
  • 最终用户体验监视器

对于大多数基于web的应用来说,访问日志提供了足够的资源分析服务请求的本质和它们的均衡关系。Web服务器可以配置成抓取最终用户请求信息并存储在一个日志文件中,称之为"访问日志"(因为该文件通常命名为"access.log")。使用访问日志定位用户行为的关键是应用交互需要能够通过不同的 URI来区分。例如,如果之前例子的动作采用类似"/login.do""/processClaim.do""/logout.do"URI,那么我们可以非常容易的在访问日志中发现这些行为并确定它们的比例。更进一步,通过最频繁的URI来排序访问日志可以快速发现占比例前n%的的若干请求,这"n"%应该在80%左右。

访问日志是文本文件,可以手动检查(不是一个很有效率的任务),可以通过编程解析,也可以通过工具来分析。对此有很多商业解决方案,不过Quest Software有一个产品Funnel Web Analyzer,虽然多年以前已经终止开发,但是由于其很受欢迎的命令,公司就作为将其作为自由软件重新发布。Funnel Web Analyzer可以分析大多数访问日志并显示用于创建合适负载测试的信息。

一些应用不像上面提到的那样简单,其用户交互无法很容易的通过一个URI来定位。例如,考虑一个包含前端控制器servlet的应用,该servlet接受一个XML有效信息——并且其业务处理逻辑就存在于该信息中。在本例中,需要另外的工具来侦测其有效信息以判断其符合哪个业务场景。这可以通过使用 servlet过滤器或者一个称为最终用户体验监视器的硬件设备来完成。

不管用户行为是如何获得的,它都是开始任何性能调优实践之前的关键先决条件。

全新应用

由于全新的应用没有任何最终用户行为可以分析,所以对我们提出了一个独特的挑战。定位新应用的用户行为需要三个步骤,如图1所示。

1 评估新应用的最终用户行为

第一步,评估最终用户应该会做什么。这步是"猜一猜"的正式说法,但应该是一个经过培训的猜测过程。评估结果应该来自于以下双方的讨论:应用业务负责人和应用技术负责人。应用业务负责人,通常是一个产品经理,负责细化最终用户应该如何使用该应用程序——例如,他可能报告说最终用户会登陆、处理五个索赔请求、过期、处理五个索赔请求、生成两个报告、然后注销。应用技术负责人,一般是架构师或是技术lead,负责把业务交互的抽象列表翻译成用于生成负载测试的技术步骤——例如,他可能报告说登陆通过"/login.do" URI完成而处理一个索赔请求需要五个URI。这些人(或者小组或者一些大型项目里的委员会)应该一起提供足够的信息来建立一个基准负载测试。

我们建立负载测试,用其调整应用和容器,应用程序部署到生产环境中,这一切做完之后,调优工作并没有结束。下一步是验证负载测试集。这通常是一个多阶段的活动:

  • 冒烟测试验证:在实际运行的一两周之内验证原先的评估值是否符合真正生产环境下最终用户的行为。这步验证是为了确认在评估过程中没有明显的错误。
  • 生产验证:一些应用需要用户花时间才能形成统一的使用方式。这个适应的时间长短因应用而异,可能是一个月或者一个季度,不过一旦用户的行为稳定下来,就需要验证最终用户行为是否与评估一致。
  • 回归验证:最好在应用的生产周期中阶段性的验证用户行为,以防止用户行为改变或者引入新的功能或工作流导致用户行为改变。

最后一步,也是经常被忽视的一步,就是反思。根据实际用户行为来反思评估的精确性是很重要的,因为只有通过反思,用户行为才能更便于理解,评估在以后的应用中才能得到提高。没有反思,相同的错误会一犯再犯,最终会增加调优的工作量。

基于等待的调优方法

建好了负载测试,接下来就是决定把调优精力放在何处。大多数调优指南都会提到"性能比率"或者度量之间的关系。例如,某调优指南可能强调说缓存命中率应该达到80%或者更高,因此负载测试应用时调整缓存大小直到命中率达到80%。然后处理列表上的下一个度量值,但是不要忘记验证调整新的参数不会影响之前已经调好的其他参数。

这项工作不仅困难而且效率很低。例如,调整缓存命中率到80%可能是件好事,但是存在一些更重要的问题:

  • 该应用如何依赖于缓存(与该缓存交互的请求比例是多少)?
  • 这些请求对应用中的其他请求有多大影响力?
  • 被缓存的条目的本质是什么?它们真的需要缓存吗?

基于等待的调优方法提出了一个新的思想,即分析应用的业务交互和实现这些交互的底层结构,然后优化这些业务交互的处理。第一步是分析应用的架构以定位实现业务请求的相关技术。每一个技术代表一个"等待点",或者说在应用的这个地方,请求可能需要等待一些事情才能继续处理。例如,如果一个请求执行了一次数据库查询,则它必须从连接池中获取一个数据库连接如果连接池里没有可用的连接,则该请求必须等待直到有连接可用。同样,如果某请求调用了一个web服务,而那个web服务维护了一个请求队列(对应一个线程池处理请求),这会潜在的导致请求等待直到一个处理线程可用。

从以上称之为等待点分析的方法中,可以定位两种类型的等待点:

  • 基于层次的等待点
  • 基于技术的等待点

本节首先概述了基于等待点的架构分析方法,然后分别研究了不同类型的等待点。

等待点架构分析

从上面讨论中得出的最重要的结论就是性能调优必须在应用架构的环境中执行。这也是调优性能比率为何如此低效的一个原因:主观的调整一个性能参数到一个最佳值,对应用可能是好事也可能是坏事——因为这可能会也可能不会有利于最终用户体验。

基于等待点的分析是一个分析应用中主要请求处理路径的过程,借此定位潜在影响该请求可能会等待的资源。在等待点分析实践中最有效的办法是定位并标出应用中核心处理路径。这包括一个请求可能访问的所有层次、请求交互的所有外部服务、被做成池的所有对象和全部缓存对象。

基于层次的等待点

一个请求穿过一个物理层,比如在web层和业务层之间切换,或者调用外部服务器,比如web服务,每当这种时候,都意味着伴随着转换,这里存在一个隐式等待点。如果服务器在某一时刻只处理单个请求是没有效率的,因此他们使用了多线程方法。典型的,一个服务器在某个socket端口监听访问的请求——每当收到一个请求它就会把请求放在队列中,然后返回监听其他请求。请求队列对应着一个线程池,负责从队列中提取请求并处理。图2描述了对于三层结构(web服务器、动态web层和业务层)的执行过程。

2 基于层次的等待点

因为请求穿越层次的动作会引起请求队列,由相应的线程池处理,这种线程池也是一个潜在的等待点。每一个线程池的大小的调优必须基于以下考虑:

  • 池必须足够大使得访问的请求无需不必要的等待一个线程。
  • 池不能大到耗尽服务器。过多的线程会迫使服务器花费大量时间用于在不同的线程上下文中切换,真正处理请求的时间反而更少了。这种情况通常表现为CPU使用率很高,但是处理请求的吞吐量却降低了。
  • 池的大小不能透支与之交互的后台资源。例如,如果数据库对于单个服务器只支持50个请求,那么服务器不应该向数据库发送超过50个数量的请求。

服务器线程池的最佳尺寸的标准是:对受限制的依赖资源产生足够的负载最大化它们的使用率而不让其透支。下面的"后退调优"一节有更多调整受限制资源池大小的内容。

基于技术的等待点

基于层次的等待点考虑的是在不同服务器之间传递请求,而基于技术的等待点关注的则是在单个服务器中如何通过有效地内部工作来传递请求。基于层次的调优,类似于IBM的队列调优,只是调整应用的有效第一步,如果忽略了调优应用服务器的内部工作,则会对应用性能产生巨大的影响。这就类似于调整JDBC连接池以发送最佳数量的负载给数据库,但是忽略了检查执行的SQL语句——如果查询需要连接十个表单,每个表单有一百万个记录,则最佳负载可能是两个连接,但是如果我们优化了查询,则数据库可能支持二百个连接。深入研究应用服务器和应用使用的潜在技术,可能存在以下通用的基于技术的等待点:

  • 池对象(比如无状态session bean或者其他应用放入池的业务对象)
  • 缓存设施
  • 持久化存储或外部依赖池
  • 通讯基础设施
  • 垃圾收集

大多数情况下,无状态session bean池的大小被应用服务器优化,不会是一个明显的等待点,除非池大小被手工错误的配置了。但是也存在一些池对象必须手动配置大小——这些可能成为有效的等待点。当一个应用需要一个池化的资源,它必须从池里获取一个资源实例,使用它,然后释放给池。如果池太小,所有的对象实例都在被使用,则请求不得不等待一个实例可用。显而易见,等待一个池化的资源会增加响应时间,如果越来越多的请求被堵塞在等待池化资源,会导致明显的性能下降。另一方面,如果池很大,它可能消耗过多内存,对总体JVM的性能产生差的影响。池的最佳大小需要权衡,只能在对池的利用情况做彻底的分析才能决定。

池化对象是无状态的,这意味着应用从池中得到哪个实例都无所谓——任何实例都行。另一方面,缓存的对象都是有状态的,也就是说当应用从缓存中请求一个对象时,它的目标是一个特定对象。举一个很粗糙的类比说明一下区别:考虑人们生活当中两种常见的活动:超市购物和接孩子放学。在超市中,任何收银员都可以接待每一位顾客,无论顾客选择哪位收银员都可以顺利结账。因此收银员可以池化。但是在接孩子放学时,每一个父母只想要他们自己的孩子,别的孩子是不行的。因此孩子可以被缓存。

如前面所述,缓存提出了一个新的调优挑战。简单说,缓存的目的是在本地内存中存储对象,使应用可以随时读取它们,而不是在需要的时候才获取他们。一个合适大小的缓存可以对通过远程调用加载对象的行为提供明显的性能改善。但是,一个不合适大小的缓存,可能产生明显的性能阻碍。因为缓存维护有状态的对象,所以重要的一点是在缓存中存储最频繁访问的对象,同时保留额外的空间来处理非频繁访问对象。试想如果缓存太小,请求会怎样:

  1. 请求检查缓存中是否存在某对象,结果失败。
  2. 请求需要查询外部资源获取对象数据。
  3. 因为缓存通常维护最频繁访问的数据,所以这个新对象需要添加到缓存中(它正在被访问)。
  4. 但是如果缓存满了,必须利用"最少最近访问"算法选择一个对象移除。
  5. 如果缓存对象的状态与外部资源不一致,则缓存对象移除之前必须更新外部资源。
  6. 新的对象此刻添加到缓存中。
  7. 新的对象最终返回给请求。

这是一个低效的过程,如果大多数请求都要执行这些步骤,那么缓存肯定会降低性能。缓存必须调整到足够大以最小化缓存的"不命中率",一次不命中意味着需要执行前面提到的七个步骤,但是也不能太大导致占用太多JVM内存。如果缓存需要非常非常大才能满足性能需要,那么最好是重新考虑被缓存对象的实质和它们到底是否值得缓存。

类似对象池,外部资源池,比如数据库连接池,也必须足够大以满足请求不会被迫等待池中的一个连接变为可用状态,但是也不能太大,导致应用浪费外部资源。"后退调优"一节讨论了如何决定这些池的最佳大小,但是在本节的上下文中,牢记它们代表了一个明显的等待点。

调优通讯基础设施远远超出了本文讨论的范围,因为其具体实现因产品不同而存在明显的区别,这包括诸如MSMQMQSeriesTIBCO等主流产品。但是请记住,如果一个应用与某消息服务器交互,它必须经过合适的调优或者它也代表了一个等待点。

最后一个明显影响JVM性能的等待点是垃圾收集。它不太适用本文中描述的等待点分析过程(检查一个请求,定位导致该请求等待的技术),但是由于它可以对性能产生显著的影响,所以把它列在这里。不同的JVM实现和不同的垃圾收集策略决定了垃圾收集如何执行,但是在很多情况下,一次主垃圾收集(或者说标记清除压缩垃圾收集)可能导致整个JVM暂停直到垃圾收集完成。一个显著提高JVM性能的办法就是优化垃圾收集。如果想了解更多垃圾收集的信息,请加入GeekCap讨论应用基础设施调优

后退调优

现在关于基于层次的和基于技术的等待点的一切都介绍完了,最后一步就是优化每一个等待点的配置。这一步有时被称为"后退调优",其思想非常简单:

  1. 开放所有基于层次的等待点和外部依赖池——也就是配置它们允许过多的负载经过服务器。
  2. 根据应用生成均衡的和具有代表性的服务请求。
  3. 定位首先透支的等待点,通常是外部依赖,比如数据库。
  4. 减小配置以控制等待点允许足够的负载经过外部依赖而不透支。
  5. 调整所有其他基于层次的等待点,发送足够的负载经过服务器,最大化受限制的等待点,但是也不让请求等待。
  6. 允许所有其他请求在业务逻辑层之上等待,比如web服务器端。

此处的原则就是应用应该发送一定数量的负载给它的外部依赖资源以最大化它们的使用率又不导致透支并且所有其他等待点应该合理配置以发送足够的负载给这些受限制的等待点。例如,如果数据库对每一个应用服务器最多支持50个连接(例如,配置池容纳4045个连接)。接下来,如果80个线程产生40个数据库连接,则应用的线程池应配置为80。最后,web服务器在任意时刻应该发送不超过80个请求给每一个应用服务器。

所有基于技术的等待点,比如对象池、缓存和垃圾回收,应该调整到最大化请求的吞吐量使得尽可能快的穿越服务器或者基于层析的等待点之间。

总结

性能调优曾经是"艺术性"多于"科学性",但是通过结合抽象分析和尝试并产生错误,基于等待的调优方法已经证明能够使该过程更具科学性和更有效率。基于等待的调优首先执行一个应用架构的等待点分析,以此定位有可能导致请求等待的某个技术。等待点来自两方面:基于层次的等待点,代表着跨越应用层次的转换;基于技术的等待点,代表着可能提高或降低性能的技术,比如缓存、池和通讯基础设施。一旦定位好了一系列等待点,调优过程就此开始:开放所有基于层次的等待点和外部依赖池,产生均衡的和具有代表性的负载,然后后退调优,收紧等待点以最大化该请求最薄弱的一环的性能,但是不要透支。基于等待的调优方法在生产环境中已经一次又一次得到了证明,不仅仅是高效的,而且允许性能工程师快速实现可度量的性能优化。

关于作者

Steven HainesGeekCap公司的创立者和CEO,该公司致力于向全球的开发社区提供电子学习解决方案,尤其侧重于诸如性能测试和性能调优这样生僻的领域。除了电子学习方案,GeekCap还提供了免费的技术论坛、学习路线图和其他资源以帮助开发人员发展自己的技术事业和学习新技术。GeekCap提供的服务包括:市场营销资料,比如白皮书和技术概要;业务服务,比如市场分析和战略定位。Steven的著作包括:许多白皮书、Java EE 5性能管和优化(Apress2006),Java 2 Primer Plus SAMS 2002)和从零学习Java 2QUE1999)。他是InformIT.comJava版主,同时也是InfoQ.comJava社区编辑。平时他作为一名承包商在Disney团队工作,负责实现下一代Disney网站的架构。他之前在Quest Software公司工作了七年,职责是作为Java领域专家设计性能监控和分析软件。他先后在California大学Irvine分校和 Learning Tree大学接受过全面的Java开发培训。您可以通过steve@geekcap.com联系他。


clock November 24, 2008 12:12 by author Sky Jia (贾超)

by Nik Cubrilovic on May 29, 2008


The next-gen web is starting to gather pace, as this week 
MySpace integrated Google Gears, Yahoo! announced their new BrowserPlus product and Google launched a browser-based edition of their 3D Earth product. Technologies and formats such as AIR,SilverlightJavaFXGearsXULWeb Applications 1.0 (DOM5, HTML5 etc.) allow developers to accelerate beyond AJAX and towards a new generation of web applications with better performance, more functionality and tighter desktop integration.

Developers and users are now presented with more web technology choice then ever before; "DLL hell" has been superseded by "plug-in hell", as a variety of companies present their versions of what the next-gen web will look like. But on the web, such choice can come at a cost to both users and developers. More than a decade has passed since the first battle over web formats, back then it was Microsoft, Netscape, Apple, AOL and others laying different foundations in the form of browsers, scripting languages, web servers and more. The legacy of that battle is still being felt today, as Javascript developers rely on whole libraries to assist them in developing cross-browser code and CSS developers depend on a catalog of hacks so that their sites can look consistent across different browsers.

With the new rich web application technologies still in the development phase, there is an opportunity to not repeat the mistakes of the past and instead take a standards-based approach. Thankfully during the course of the previous decade companies such as Microsoft became more receptive to open standards, data portability and cross-platform support. Having broad support for open standards simplifies technology for both users and developers, but it is obvious that not all of the currently announced technologies, such as those listed above, will

During the course of a series of posts here on Techcrunch we will look at various elements that make up the next-gen web and evaluate the options available, current support as well as how well standards are being adopted. In light of the recent announcement from MySpace that they are using Google Gears in their application, in this first post we will evaluate browser-based local storage cache's.

Browser-based Local Storage

As web applications became more popular there was a general demand for an ability to run web-based applications offline. The first such solutions that could work without requiring a browser plugin or separate application were those that relied on the caching headers within HTTP to store objects within the browsers cache. Javascript libraries such as Dojo implemented support for offline web applications using the same principals, but applications were very limited in scope as there was no easy way to store structured data on the browser (Dojo now also abstracts a variety of other storage engines including Gears- tip: Dylan) .

In May of 2007, Google launched Google Gears, a browser plugin that allows web applications to synchronize data into a local data store and then allow web applications to function offline. At the launch of Gears, Google Reader was adapted to support it, and the emphasis of the pitch for Gears was about offline application access. What was less known is that Gears is a lot more than just offline access, as it provides three primary functions:

  • Caching of resources (HTML pages, images etc.)
  • Structured data storage in a database
  • Asynchronous background worker threads

The part of this we will focus on here is the local object and structured data storage. Gears provides these functions via a Javascript API, which can be accessed by any web application. The structured storage is provided by Sqlite, a popular lightweight RDBMS. With the local database, the developer can not only perform queries and inserts to record new data, but also more complex SQL like joining between tables etc. Although you can have multiple applications using Gears, each app runs in a sanboxed environment with a domain-based security model (similar to cookies and Ajax requests). Sqlite has been built into Firefox since version 2.0, but its API is only accessible from an add-on or a core Firefox component. The Gears plugin bridges that gap and makes it available within the client scripting environment.

Before Gears was launched, the Web Hypertext Application Technology Workgroup(WHATWG) had begun work on its Web Applications 1.0 draft spec, which included structured data storage as part of HTML5. The current draft spec from the working group includes definitions for a Database object for accessing and querying a local data store. The details of the implementation are left up to the vendor, but the API is detailed in the spec. Firefox will be implementing parts of the same storage API from the WHATW spec in version 3.0 of the browser, which is currently available as a preview release. The key components of the WHATWG spec are:

  • ApplicationCache - for storing objects in the local browser cache (and checking them)
  • navigator.onLine - check if the browser is online or not (and use cache plus local data store if required)
  • Storage interface and events - used for storing name and value pairs via thesessionStorage DOM attribute.
  • Database interface - used for connecting to the local database. Supports SQL (or a subset thereof, depending on the server used), versioning, error events via callback
  • Threading and Callbacks - so that multiple requests can be sent to the local data store asynchronously.

Implementing local storage, caching and offline access are relatively easy. The application can first check to see if these functions are supported, and then setup the local cache by synchronizing the users data in background processes. While a thread is running, either uploading or downloading, you can query it to check on its status to provide the user with feedback (eg. a progress bar). Once the data is local, by running database queries on the local machine developers are able to drastically improve performance. Currently many web applications use the browser as only a presentation layer, for eg. a spreadsheet application may do a round-trip back to the server to work out even elementary calculations such as=1+1. By utilizing the local data store and client-side code, the developer is able to offload processing and storage to the client and provide a much smoother, desktop-like experience at the same time.

Current And Future Support

The issue is that the majority of the WHATW specification was written after Gears was released, so the Database and LocalServer objects used in Gears are not compatible with WHATW - for now. The good news is that Google have come out and fully backed the storage portions of the WHATWG HTML5 spec, so developers with apps running on Firefox 3 with Gears installed will have a choice to use either the native implementation, or the Google implementation. Google go on to say that they will likely offer extra features as an incentive for developers to continue to target Gears over-and-above the HTML5 implementation (features such as desktop shortcuts, etc.).

Other alternatives for local data storage, such as Flash local storage, are completely incompatible with the WHATW specification. The developers at WebKit were very quick to announce that they have started implementing the storage portions of the HTML5 spec also. It is currently available in nightly builds, so in the near future we will see support in both Konquror and Safari. Opera have also announced similar plans and they are actually leading everybody when it comes to implementing HTML5 and Web Forms. Yahoo! BrowserPlus was only announced yesterday, and it is currently unclear wether their local storage support is compatible with the specification as laid out by the working group.

Local storage is a major new feature of the new web API, and developers will not only have consistent support across browsers but will also have the option of Google Gears (which is already available) as well as Yahoo! BrowserPlus (depending on how it works). There is just one browser maker missing in this discussion so far and that is Microsoft. Microsoft have released an early preview of IE8 and announced a raft of new features, a lot of which are based on open standards such as better CSS and Javascript support (with a more standardized object model). The big question is wether we will see consistent local storage support from IE8 following the same spec as the other browser vendors. The IE team have announced that IE8 will support DOM Storage, but that is only part of the overall local storage spec (ie the Storage object described above only).

Overview of Current And Future Support

  

Gears

BrowserPlus

Firefox

IE8

Webkit

ApplicationCache

soon

detect onLine

LocalServer

Storage

Database

Threading

SQL

Notes: Once details of BrowserPlus are known the table will be filled in. Gears has pledged to adapt the standard. IE8 has only announced partial support. WebKit have most functionality available in their nightly builds. Both Flash and Silverlight have some form of local storage but not the HTML5 standard API.

It is very rare that a new technology such as local browser storage is so broadly advocated and supported mostly under a single spec. While Microsoft may not have yet announced full support, there is no doubt that they are heading in the right direction. It is also encouraging that implementations from Google Gears and Firefox 3 will follow the working group spec for HTML5. While the new versions of these browsers will not be available broadly for a while longer, Google Gears is available today and since all vendors are targeting the same API, developers can today confidently target and write for the Gears storage API with confidence - something that was almost impossible to do not so long ago.

So with local browser storage and caching, so far the open standard is the winner. The alternate solutions are likely to fall by the wayside or will adapt to implementing the same API.


clock October 16, 2008 10:38 by author Sky Jia (贾超)

什么是体系架构的生命期?应该考虑到何种程度?它对业务可能有何影响?为了回答这些问题,Dan Pritchett引入了“体系架构保质期”的概念,他将其定义为“开始设计新的系统时,一组模式和技术的适用期限”。他认为体系架构保质期能持续5年左右,经过两到三代以后,任何体系架构至少会有部分的改变。否则,该体系架构就会很陈旧,而且在适应业务需求发展时会引起成本的增加。基于此,Pritchett认为“体系架构通常有10到15年的有效期”。为了支持自己的论点,他给出了自1990年以来发生的技术、体系架构演进的一系列例证。

Pritchett主张,如果没有在体系架构生命期结束的时候更新体系架构,可能会对业务有重大的影响。但他也承认,改变主要的体系架构会导致可观的成本,尤其是“你在供应链里已经拥有了坚实的客户基础,以及超值的业务特性”。正如争论:是否应该避免架构重写?中涉及的几个作者所强调的一样,改变甚至是破坏性的。不过Pritchett认为,不采用新的模式和技术会带来更大的成本。这些技术和模式通常有助于提高开发者的效率、降低部署的成本。拒绝利用这一潜在的竞争优势相当于让竞争对手占尽先机,对业务来说这可是致命的:

被忽略的是,新的模式和平台无论如何都能用来破坏你的业务。如果你拥有成功的业务,许多人也会想分一杯羹。技术就成了他们追赶你业务的工具。他们会以更低的成本或者更具竞争力的特性提供和你一样的服务,这引起的破坏可要远甚于内部体系架构改变所引起的破坏。

在他第一篇文章的续作中,Pritchett提出随着新模式和技术的涌现,主要体系架构改变的必然性上存在一些细微的差别。他曾经讲过,体系架构的生命期依赖于其轻松扩展以适应演进业务需求的能力,他将这一点转换为技术术语,解释为“随着不断风行的新技术而被更新”的能力。“遵循优良构件设计的标准体系架构原则,保持组件间最大限度的松耦合度”能强化这一能力,使得这些构件可以相互独立地实现和演进。基于识别的一些常见错误,Pritchett提取出了一 些要构建更持久的体系架构可采纳的原则

1. 接口协议和实现策略之间的解耦。这将增加“构件在可选实现技术之间移植的灵活性”。Pritchett建议,构件之间定义像XML或JSON之类的、基于文本的接口可以达到这个目的。

2. 注重关注点分离,即使两个关注点的初始大小差别很大。这可以避免如下情形:为现有构件增加一个新特性,随着该新特性逐渐发展,你最终等于把两个组件实现成一个严重耦合、相互纠缠、难于解耦的组件,特别是当“解耦后无法保持客户已经习惯的旧有行为”,更加难以解耦。

3. 避免无意识的供应商依赖,这种依赖需要深入理解供应商的产品、它们对体系架构及其含义的影响。

4. 最小化持久化绑定,避免数据库依赖。对实体的关键访问路径应该仅通过主键,其它访问路径则应该在资源层进行分离,以便将来在其它形式的持久化中能处理这些可选路径。

遵循以上尽可能降低耦合度的规则可以让我们构建灵活的体系架构,这样的体系架构更容易与新技术和新模式集成,从而降低改变的成本、延长体系架构的生命期。

查看英文原文:Architecture Life Span:Implications on Business and how to build more Long-lasting Architecture


clock September 23, 2008 10:16 by author Sky Jia (贾超)

在每个里程碑,站点负担都会超过底层系统部分组件的最大载荷,特别是数据库和存储系统。接着,功能出现问题,用户失声尖叫。最后,技术团队必须为此修订系统策略。

虽然自2005年早期,站点账户数超过7百万后,系统架构到目前为止保持了相对稳定,但MySpace仍然在为SQL Server支持的同时连接数等方面继续攻坚,Benedetto说,"我们已经尽可能把事情做到最好"。

里程碑一:50万账户

按Benedetto 的说法,MySpace最初的系统很小,只有两台Web服务器和一个数据库服务器。那时使用的是Dell双CPU、4G内存的系统。

单个数据库就意味着所有数据都存储在一个地方,再由两台Web服务器分担处理用户请求的工作量。但就像MySpace后来的几次底层系统修订时的情况一样,三服务器架构很快不堪重负。此后一个时期内,MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。

但到在2004年早期,MySpace用户数增长到50万后,数据库服务器也已开始汗流浃背。

但和Web服务器不同,增加数据库可没那么简单。如果一个站点由多个数据库支持,设计者必须考虑的是,如何在保证数据一致性的前提下,让多个数据库分担压力。

在第二代架构中,MySpace运行在3个SQL Server数据库服务器上——一个为主,所有的新数据都向它提交,然后由它复制到其他两个;另两个全力向用户供给数据,用以在博客和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器,加大硬盘,就可以应对用户数和访问量的增加。

里程碑二:1-2百万账户

MySpace注册数到达1百万至2百万区间后,数据库服务器开始受制于I/O容量——即它们存取数据的速度。而当时才是2004年中,距离上次数据库系统调整不过数月。用户的提交请求被阻塞,就像千人乐迷要挤进只能容纳几百人的夜总会,站点开始遭遇"主要矛盾",Benedetto说,这意味着MySpace永远都会轻度落后于用户需求。

"有人花5分钟都无法完成留言,因此用户总是抱怨说网站已经完蛋了。"他补充道。

这一次的数据库架构按照垂直分割模式设计,不同的数据库服务于站点的不同功能,如登录、用户资料和博客。于是,站点的扩展性问题看似又可以告一段落了,可以歇一阵子。

垂直分割策略利于多个数据库分担访问压力,当用户要求增加新功能时,MySpace将投入新的数据库予以支持它。账户到达2百万后,MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN(Storage Area Network,存储区域网络)——用高带宽、专门设计的网络将大量磁盘存储设备连接在一起,而数据库连接到SAN。这项措施极大提升了系统性能、正常运行时间和可靠性,Benedetto说。

里程碑三:3百万账户

当用户继续增加到3百万后,垂直分割策略也开始难以为继。尽管站点的各个应用被设计得高度独立,但有些信息必须共享。在这个架构里,每个数据库必须有各自的用户表副本——MySpace授权用户的电子花名册。这就意味着一个用户注册时,该条账户记录必须在9个不同数据库上分别创建。但在个别情况下,如果其中某台数据库服务器临时不可到达,对应事务就会失败,从而造成账户非完全创建,最终导致此用户的该项服务无效。

另外一个问题是,个别应用如博客增长太快,那么专门为它服务的数据库就有巨大压力。

2004年中,MySpace面临Web开发者称之为"向上扩展"对"向外扩展"(译者注:Scale Up和Scale Out,也称硬件扩展和软件扩展)的抉择——要么扩展到更大更强、也更昂贵的服务器上,要么部署大量相对便宜的服务器来分担数据库压力。一般来说,大型站点倾向于向外扩展,因为这将让它们得以保留通过增加服务器以提升系统能力的后路。

但成功地向外扩展架构必须解决复杂的分布式计算问题,大型站点如Google、Yahoo和Amazon.com,都必须自行研发大量相关技术。以Google为例,它构建了自己的分布式文件系统。

另外,向外扩展策略还需要大量重写原来软件,以保证系统能在分布式服务器上运行。"搞不好,开发人员的所有工作都将白费",Benedetto说。

因此,MySpace首先将重点放在了向上扩展上,花费了大约1个半月时间研究升级到32CPU服务器以管理更大数据库的问题。Benedetto说,"那时候,这个方案看似可能解决一切问题。"如稳定性,更棒的是对现有软件几乎没有改动要求。

糟糕的是,高端服务器极其昂贵,是购置同样处理能力和内存速度的多台服务器总和的很多倍。而且,站点架构师预测,从长期来看,即便是巨型数据库,最后也会不堪重负,Benedetto说,"换句话讲,只要增长趋势存在,我们最后无论如何都要走上向外扩展的道路。"

因此,MySpace最终将目光移到分布式计算架构——它在物理上分布的众多服务器,整体必须逻辑上等同于单台机器。拿数据库来说,就不能再像过去那样将应用拆分,再以不同数据库分别支持,而必须将整个站点看作一个应用。现在,数据库模型里只有一个用户表,支持博客、个人资料和其他核心功能的数据都存储在相同数据库。

既然所有的核心数据逻辑上都组织到一个数据库,那么MySpace必须找到新的办法以分担负荷——显然,运行在普通硬件上的单个数据库服务器是无能为力的。这次,不再按站点功能和应用分割数据库,MySpace开始将它的用户按每百万一组分割,然后将各组的全部数据分别存入独立的SQL Server实例。目前,MySpace的每台数据库服务器实际运行两个SQL Server实例,也就是说每台服务器服务大约2百万用户。Benedetto指出,以后还可以按照这种模式以更小粒度划分架构,从而优化负荷分担。

当然,还是有一个特殊数据库保存了所有账户的名称和密码。用户登录后,保存了他们其他数据的数据库再接管服务。特殊数据库的用户表虽然庞大,但它只负责用户登录,功能单一,所以负荷还是比较容易控制的。

里程碑四:9百万到1千7百万账户

2005年早期,账户达到9百万后,MySpace开始用Microsoft的C#编写ASP.NET程序。C#是C语言的最新派生语言,吸收了C++和Java的优点,依托于Microsoft .NET框架(Microsoft为软件组件化和分布式计算而设计的模型架构)。ASP.NET则由编写Web站点脚本的ASP技术演化而来,是Microsoft目前主推的Web站点编程环境。

可以说是立竿见影, MySpace马上就发现ASP.NET程序运行更有效率,与ColdFusion相比,完成同样任务需消耗的处理器能力更小。据技术总监Whitcomb说,新代码需要150台服务器完成的工作,如果用ColdFusion则需要246台。Benedetto还指出,性能上升的另一个原因可能是在变换软件平台,并用新语言重写代码的过程中,程序员复审并优化了一些功能流程。

最终,MySpace开始大规模迁移到ASP.NET。即便剩余的少部分ColdFusion代码,也从Cold-Fusion服务器搬到了ASP.NET,因为他们得到了BlueDragon.NET(乔治亚州阿尔法利塔New Atlanta Communications公司的产品,它能将ColdFusion代码自动重新编译到Microsoft平台)的帮助。

账户达到1千万时,MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题,但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统读写数据的极限速度。

原因之一是每数据库1百万账户的分割策略,通常情况下的确可以将压力均分到各台服务器,但现实并非一成不变。比如第七台账户数据库上线后,仅仅7天就被塞满了,主要原因是佛罗里达一个乐队的歌迷疯狂注册。

某个数据库可能因为任何原因,在任何时候遭遇主要负荷,这时,SAN中绑定到该数据库的磁盘存储设备簇就可能过载。"SAN让磁盘I/O能力大幅提升了,但将它们绑定到特定数据库的做法是错误的。"Benedetto说。

最初,MySpace通过定期重新分配SAN中数据,以让其更为均衡的方法基本解决了这个问题,但这是一个人工过程,"大概需要两个人全职工作。"Benedetto说。

长期解决方案是迁移到虚拟存储体系上,这样,整个SAN被当作一个巨型存储池,不再要求每个磁盘为特定应用服务。MySpace目前采用了一种新型SAN设备——来自加利福尼亚州弗里蒙特的3PARdata。

在3PAR的系统里,仍能在逻辑上按容量划分数据存储,但它不再被绑定到特定磁盘或磁盘簇,而是散布于大量磁盘。这就使均分数据访问负荷成为可能。当数据库需要写入一组数据时,任何空闲磁盘都可以马上完成这项工作,而不再像以前那样阻塞在可能已经过载的磁盘阵列处。而且,因为多个磁盘都有数据副本,读取数据时,也不会使SAN的任何组件过载。

当2005年春天账户数达到1千7百万时,MySpace又启用了新的策略以减轻存储系统压力,即增加数据缓存层——位于Web服务器和数据库服务器之间,其唯一职能是在内存中建立被频繁请求数据对象的副本,如此一来,不访问数据库也可以向Web应用供给数据。换句话说,100个用户请求同一份资料,以前需要查询数据库100次,而现在只需1次,其余都可从缓存数据中获得。当然如果页面变化,缓存的数据必须从内存擦除,然后重新从数据库获取——但在此之前,数据库的压力已经大大减轻,整个站点的性能得到提升。

缓存区还为那些不需要记入数据库的数据提供了驿站,比如为跟踪用户会话而创建的临时文件——Benedetto坦言他需要在这方面补课,"我是数据库存储狂热分子,因此我总是想着将万事万物都存到数据库。"但将像会话跟踪这类的数据也存到数据库,站点将陷入泥沼。

增加缓存服务器是"一开始就应该做的事情,但我们成长太快,以致于没有时间坐下来好好研究这件事情。"Benedetto补充道。

里程碑五:2千6百万账户

2005年中期,服务账户数达到2千6百万时,MySpace切换到了还处于beta测试的SQL Server 2005。转换何太急?主流看法是2005版支持64位处理器。但Benedetto说,"这不是主要原因,尽管这也很重要;主要还是因为我们对内存的渴求。"支持64位的数据库可以管理更多内存。

更多内存就意味着更高的性能和更大的容量。原来运行32位版本的SQL Server服务器,能同时使用的内存最多只有4G。切换到64位,就好像加粗了输水管的直径。升级到SQL Server 2005和64位Windows Server 2003后,MySpace每台服务器配备了32G内存,后于2006年再次将配置标准提升到64G。

意外错误

如果没有对系统架构的历次修改与升级,MySpace根本不可能走到今天。但是,为什么系统还经常吃撑着了?很多用户抱怨的"意外错误"是怎么引起的呢?

原因之一是MySpace对Microsoft的Web技术的应用已经进入连Microsoft自己也才刚刚开始探索的领域。比如11月,超出SQL Server最大同时连接数,MySpace系统崩溃。Benedetto说,这类可能引发系统崩溃的情况大概三天才会出现一次,但仍然过于频繁了,以致惹人恼怒。一旦数据库罢工,"无论这种情况什么时候发生,未缓存的数据都不能从SQL Server获得,那么你就必然看到一个'意外错误'提示。"他解释说。

去年夏天,MySpace的Windows 2003多次自动停止服务。后来发现是操作系统一个内置功能惹的祸——预防分布式拒绝服务攻击(黑客使用很多客户机向服务器发起大量连接请求,以致服务器瘫痪)。MySpace和其他很多顶级大站点一样,肯定会经常遭受攻击,但它应该从网络级而不是依靠Windows本身的功能来解决问题——否则,大量MySpace合法用户连接时也会引起服务器反击。

"我们花了大约一个月时间寻找Windows 2003服务器自动停止的原因。"Benedetto说。最后,通过Microsoft的帮助,他们才知道该怎么通知服务器:"别开枪,是友军。"

紧接着是在去年7月某个周日晚上,MySpace总部所在地洛杉矶停电,造成整个系统停运12小时。大型Web站点通常要在地理上分布配置多个数据中心以预防单点故障。本来,MySpace还有其他两个数据中心以应对突发事件,但Web服务器都依赖于部署在洛杉矶的SAN。没有洛杉矶的SAN,Web服务器除了恳求你耐心等待,不能提供任何服务。

Benedetto说,主数据中心的可靠性通过下列措施保证:可接入两张不同电网,另有后备电源和一台储备有30天燃料的发电机。但在这次事故中,不仅两张电网失效,而且在切换到备份电源的过程中,操作员烧掉了主动力线路。

2007年中,MySpace在另两个后备站点上也建设了SAN。这对分担负荷大有帮助——正常情况下,每个SAN都能负担三分之一的数据访问量。而在紧急情况下,任何一个站点都可以独立支撑整个服务,Benedetto说。

MySpace仍然在为提高稳定性奋斗,虽然很多用户表示了足够信任且能原谅偶现的错误页面。

"作为开发人员,我憎恶Bug,它太气人了。"Dan Tanner这个31岁的德克萨斯软件工程师说,他通过MySpace重新联系到了高中和大学同学。"不过,MySpace对我们的用处很大,因此我们可以原谅偶发的故障和错误。" Tanner说,如果站点某天出现故障甚至崩溃,恢复以后他还是会继续使用。

这就是为什么Drew在论坛里咆哮时,大部分用户都告诉他应该保持平静,如果等几分钟,问题就会解决的原因。Drew无法平静,他写道,"我已经两次给MySpace发邮件,而它说一小时前还是正常的,现在出了点问题……完全是一堆废话。"另一个用户回复说,"毕竟它是免费的。"Benedetto坦承100%的可靠性不是他的目标。"它不是银行,而是一个免费的服务。"他说。

换句话说,MySpace的偶发故障可能造成某人最后更新的个人资料丢失,但并不意味着网站弄丢了用户的钱财。"关键是要认识到,与保证站点性能相比,丢失少许数据的故障是可接受的。"Benedetto说。所以,MySpace甘冒丢失2分钟到2小时内任意点数据的危险,在SQL Server配置里延长了"checkpoint"操作——它将待更新数据永久记录到磁盘——的间隔时间,因为这样做可以加快数据库的运行。

Benedetto说,同样,开发人员还经常在几个小时内就完成构思、编码、测试和发布全过程。这有引入Bug的风险,但这样做可以更快实现新功能。而且,因为进行大规模真实测试不具可行性,他们的测试通常是在仅以部分活跃用户为对象,且用户对软件新功能和改进不知就里的情况下进行的。因为事实上不可能做真实的加载测试,他们做的测试通常都是针对站点。

"我们犯过大量错误,"Benedetto说,"但到头来,我认为我们做对的还是比做错的多。"

MySpace Tech Roster

January 16, 2007

By David F. Carr


Search

Calendar

<<  September 2010  >>
SuMoTuWeThFrSa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Categories

Tags