性能主题

如何建立高性能的应用系统

  一个高性能的应用程序,它可能意味着以下任何/所有:

  • 低延迟(意味着页面加载时间快)
  • 应用程序可以应付不断增加的用户数量(可扩展性Scalable)
  • 应用程序不会当机(无论是高度可用性)

随着弹性计算的来临,人们往往认为,通过增加硬件到应用系统中,我们也许能够实现上述目标。但这只是粗粒度高成本的解决方案,有时为了实现上述的场景采用的技术是不同的,重要的是要找到正确的方法。

一、低延迟

多层架构是低延迟的主要原因之一,Web服务器 - >应用程序服务器 - >数据库和数据序列化/反序列化是的整体延迟最大的功臣。放在一个JVM可以解决一些问题,人们可以有Web层和应用层之间的应用程序代码中的逻辑分离,但不需要有物理分离。使用Spring容器可以解决,但是如果使用SOA,实现多个Web服务调用和JMS传输,网络延迟和序列化还是出现,这时使用 IBM Datapower XML 加速器能降低XML负载。使用Solace消息路由提升消息传递速度。

将数据更靠近应用

数据需要贴近应用,这样可以减少数据库连接调用和从数据库获取数据。应用程序可以使用缓存数据以减少调用DB。你也可以使用像Memcached或Ehcache缓存服务器缓存 Web /应用层数据。 Web层可以缓存的数据,如静态HTML片段/图片/ JavaScript/ CSS的文件。应用层可以缓存非事务性的数据(如查找地图)。 OR映射工具比如Hibernate也支持数据高速缓存。如果它是一个互联网的Web应用程序,还可以利用CDN(内容分发网络)/ EDGE网络(如Akamai的),以加快提供静态内容。

磁盘IO

另一个应用程序的性能链中的薄弱环节是磁盘I / O。一种方法来克服磁盘I / O的限制是内存中的数据。如内存数据库(olt DB or Solid DB or Oracle TimesTen),XTP解决方案(如Oracle coherence, IBM eXtreme Scale, GigaSpaces eXtreme应用平台)可以加快应用程序的性能。

优化的硬件

托管应用程序的硬件也可以进行调整,以减少延迟。优化措施就像采取10G/20G光纤通道,低延时开关,SSD(固态硬盘),不使用虚拟化技术,可以确保减少应用延迟。

传输机制

有时,传输机制也可以增加应用程序的延迟。例如安全的通信(如https)可以增加的延迟,在接收端将数据解密有额外开销。一种方式是在负载平衡器/防火墙卸载SSL。

对于延迟,你需要测量发现什么是瓶颈。一旦明显的瓶颈已经解决,你可以经历缓存颠簸,可怜的算法,数据腹胀,标注错误等。所有提到的技术可能不一定适用所有情况,架构师需要对待延迟要求处于待命状态。

 

二、应用的扩展性

可伸缩性意味着应用程序有能力处理越来越多的数据,在不影响性能的情况下提升并发量,。重要的事情要注意的是可扩展性不应该让应用程序付出性能的带你。

无态服务

应用程序应该在一些集中的存储库中存储其状态,但应用程序本身应该是无状态的。这意味着没有存储在本地文件系统上的数据或状态。无状态应用程序允许添加任意数量的应用实例,以适应不断增长。但不久,集中存储库开始成为瓶颈。面对日益增加的数据,数据库(RDBMS)性能曲线可能会开始向下弯曲。解决这个问题的方法之一是在数据库中尽量减少可变状态。要处理这样的情况下,根据需要应用实现数据分片技术也是一种方法。管理数据库写争夺的另一种方法是使用NoSQL数据存储的部分或全部应用程序数据。

负载平衡

如果流量开始往上走,应用程序可以通过添加额外的服务器实例,以服务请求处理额外的负载。负载平衡器将确保没有服务器超出他们的负荷,负载上升时自动增加一条新的实例(自动缩放)。也可以添加到数据库负载均衡技术,如主 - 主拓扑或主从(与分区读取和写入数据)来处理额外的负载。但是,如果数据是在PB的范围内,需要使用分片的数据复制技术的数据。in-memory数据网格架构也能扩展数据。

容错/动态侦测元素

在处理大型集群中运行的应用程序是,动态监视是非常重要的,这样能避免人工干预。例如当应用程序的负载达到定义的负载时,该应用程序监控应可以自动添加一个新的实例,负载平衡器应该能够识别利用它。同样,当数据变成切片,应用程序应该能够识别和查找新的IP连接。如果应用程序是不能连接到特定的资源,应用程序应该是足够的智能识别故障并尝试访问的替代资源的。该应用程序将需要有一个中央元数据存储库由应用程序可以挖掘所有此类容错方案。见ZooKeeper.

三.应用的可用性

冗余 - 应用程序需要通过扩展弥补的任何实例损失(无论是硬件还是软件) 。在所有层软件,硬件,电源,甚至在数据中心级别,需要建立冗余。

容错 - 应用程序需要容错(例如重试机制) ,以确保它可以利用动态分配的资源,以保持运作。

监视/测试 - 应用程序可用性的另一个被忽略的因素是应用程序的监控。如果应用程序没有适当的监控,停电导致应用程序不可用无法被发现。监控整个应用程序堆栈,并采取纠正措施的能力是非常重要的。netflix采取Chaos Monkey混沌猴子是非常有帮助的。

配置数据 - 任何应用程序都需要持续可用,那么需要运行使用配置。例如如果应用程序引入了新的服务接口,应用程序应该有能力使用新的接口或继续使用旧。

缓存