应用系统架构的发展历程



应用系统架构演变初探

背景

近几年的互联网创业风潮持续在高涨中,所涉及的行业从涵盖了社交、资讯、电商、生活服务等方方面面。其中也涌现不少优秀的APP,而这些产品或平台的特点都包含了"快速",即更新快,迭代快的特性。

然而作为一名软件工程师的角度,按以前软件工程的理论来说,系统在设计初期应考虑更多的复杂度、良好的扩展性,尽可能达到以不变应万变的结果,而这些快速变更的新秀产品,在系统架构上如何做到灵活扩展、快速演进的呢? 这便是以下要开始探讨的内容。

一、初定系统架构

在最开始的时候,产品经理(或项目经理)找到你,在唠唠叨叨叙述完整个系统的功能需求后,要求你一个月内就开发出来。

经理:
    "领导那边催得要命,一个月内必须上线!"
    "这些功能都很常规呢,需要开发这么久吗!"

你:
    ...

当然,以上的场景稍显夸张,但在互联网思维方式的APP开发场景下,这样的节奏其实很常见。

研发经理都是任劳任怨的角儿,于是乎,大脑开始高速运转:

"这么短的的时间" .. "好吧,先不考虑性能问题了!"
"单元测试也可以省了,做好自测就可以,能省下不少时间呢"

经过一轮挣扎和思考,研发经理推断出了产品的第一代系统架构

架构特点

单点,以满足功能为主,简单、轻量级架构。

数据流

来自多种场景的的http请求直接由单个server接入、完成业务逻辑处理、输出计算结果。

    组件介绍

1    App Server,应用系统的服务端节点,可以有很多种选择,以Java系列为例:

tomcat

最流行不过的j2ee容器,官网 http://tomcat.apache.org/

jetty

一款更为轻量级的servlet容器,轻量小巧,提供可编程server的实现(容易嵌入),在continuation机制也有比较良好的表现。

详细参见 http://www.eclipse.org/jetty/

playframework

此前最为喜爱的一款非主流应用服务器,应该是首个java版本的"ruby on rails"的实现。其摒弃了j2ee繁重的各种理念枷锁,让编程变得更加简单、可依赖。

playframework框架目前已经主推2.x (同时支持java和scala)版本,然而学习曲线相较1.2.x版本更加陡峭,建议可从1.2.5版本开始入门使用。

值得一提的是该框架内置了netty以支持http请求的接入及处理。

netty是一款基于NIO实现的轻量级http服务器,

关于netty的实现原理可参考: http://stonexmx.blog.163.com/blog/static/122158587201061331614536/

play框架的官网:https://www.playframework.com/

2  mysql,流行的开源数据库,应用基于JPA/JDBC进行访问,以实现数据持久化

3  memcached,高速的内存服务器系统,支持KV数据流的快速读写,用作数据缓存及加速访问

官网地址:http://memcached.org/

二、演变的开始

好的,经过一个月的努力,系统上线了。

运营也开始干活,紧接着是对线上各种问题的紧急修复。

系统渐渐有了一些活跃度,在几个月内,产品经理和研发经理开始听到了一些抱怨:

 "系统怎么老挂啊,动不动就访问不了,这什么破玩意啊"
 "我这都已经换成wifi了,图片怎么还是一直加载不了呢?"
  .....

所谓积少成怨,团队终于顶不住压力,下决心开始优化系统。针对上述的问题,分析如下:

1  可用性;

单点发生崩溃,整个系统直接不可用,所有用户将受到影响;

JVM的内存溢出,系统进程意外终止都可能导致这样的问题。

2  带宽;

应用系统在初期设计时更多的考虑了网络调用、html动态页面的输出,而针对图片的访问并未做过多考虑,因此文件资源访问很快出现了瓶颈。

研发经理决定将架构优化如下

 负载均衡

使用nginx提供应用服务器的负载均衡,提供两个应用服务器节点,保证单点崩溃时而系统仍然可用。

文件访问分离

使用单独的web服务器(nginx)用作文件访问服务器,所有的静态图片地址将指向独立域名。

三、加速进化

继上一次优化之后,用户的抱怨已经明显减少,产品经理和领导都对此次工作表示满意。

研发经理开始感受到了前所未有的成就感。

然而好景不长,在几个月后公司重点引入了营销团队。这是相当给力的团队,在短短的时间内,在各大网络平台布置了多个入口。

各种推广活动、事件营销接踵而来。最可观的如在微信朋友圈的一次事件营销直接引入了好几倍的用户量。

这样的情况在互联网产品的发展轨迹上至少也可以称得上一次小小的爆发式增长了。

当然,领导、产品经理都开心和兴奋起来了。但这次,研发经理内心开始发愁了:

1  访问压力;

一个server的并发处理能力很容易达到上限,一旦超过负载阈值,将直接导致访问时长加大,甚至系统崩溃、无法访问等情形;

2  数据存取;

数据量的扩充,单个数据库表不断增大,查询速度将产生下降;

此外数据库的单点也成为隐患

3  缓存空间;

与数据库同理,为加速更多数据的访问,需要提供更大容量缓存空间;

这次,研发经理将系统架构做了一次较为彻底的改进:

负载均衡

增加负载均衡的服务器节点,提高整体处理能力;

数据库扩展

采取水平切分的方式,实现基于Shard的分布式数据库集群;

memcached集群

开启多个memcached节点,组成高可用的缓存集群,同时可支持更大的缓存空间

其中对于服务端程序改造最大的在于分布式Shard数据的实现,一般可从数据量较大的局部表开始切分,在数据存取上加入水平分库的机制;

当然此时的数据迁移工作也是一个重点。

四、未来的展望

至此,系统优化已经告一段落。当前的后台架构已经处在一个表现稳定,容易扩展的一个状态。

性能指标方面大致已经可以达到百万级用户量,日PV过百万,甚至还可能更好。

然而这还仅仅是一个雏形,应用系统的场景是多种多样的,在未来需要解决的问题往往不仅仅这些,比如:

1  系统存在全文搜索、或是标签式搜索的场景,为了提高搜索性能,你可能会引入sphinx中间件;

sphinx的中文版本为coreseek(可支持中文全文搜索),。

详见官网:http://www.coreseek.cn/

2  为了提高事务处理的效率,你需要队列服务器来解决,这个可以是ttserver + worker的模式;

3  频繁的处理缓存数据的解析在开发上会比较麻烦,你还可以更换redis来直接支持数据结构式的缓存...

redis为一款支持数据结构缓存及数据持久化的优秀的nosql中间件,

官网地址:http://redis.io/

备注

架构设计需秉承的"适用"原则,不同业务场景所采取的架构都会有些差异,此处仅仅讨论最常见的扩展思路,关于读写分离、数据主备等做法在此不做讨论。

本文所提及的故事情节均属杜撰,如有雷同,实属巧合。

时间: 2024-11-03 03:31:43

应用系统架构的发展历程的相关文章

豆瓣网技术架构的 发展历程(一)

豆瓣简介: •2005年3月上线 •以分享和发现为核心的社区 •读书.电影.音乐.小组.同城.九点 •我的豆瓣.友邻  一些数据: •2.8M注册用户,约1/4活跃用户•千万级非注册用户•20M动态请求/天,峰值500~600/sec•23台普通PC服务器(1U*15/2U*8) •12台提供线上服务•38G memcached 单服务器: • 单台1U服务器 (frodo)• 单核AMD Athlon 64 1.8GHz• 1G内存,160G SATA*2• Gentoo Linux• MyS

(转)大型网站架构演化发展历程

前面已经描述了大型网站系统的特点,而对一个大型网站系统,其架构也是重要的一个环节. 大型网站技术主要的挑战来自于庞大的用户.高并发以及海量的数据这三个方面.大型网站的形成就像一颗大树的成长,历尽长时间的磨练,最后枝繁叶茂,服务他人. 初始网站架构结构 起初的网站鉴于用户量.访问量较少,只需要一台服务器足以,应用程序.数据库.文件等其所有资源放在一太服务器上就已经足够满足此时的需求,这时候网站的架构就几个简单组成部分如下图 应用和数据服务分离 随着网站业务需求的发展,越来越多的用户进行访问,此时一

网站架构演化发展历程

大型网站系统的特点 1,高并发,大流量:需要面对高并发用户,大流量访问. 2,高可用:不间断服务. 3,海量数据:管理处理海量数据,使用大量服务器. 4,需求快速变更,发布频繁:互联网产品为快速适应用户需求,版本迭代. 1. 初始阶段的网站架构 2. 应用服务器和数据服务分离 随着网站业务的发展,一台服务器逐渐不能满足需求:越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足.这是就需要将应用和数据分离.应用和数据分离后整个网站使用三台服务器:应用服务器.文件服务器和数据库服务器,

大型网站架构演化发展历程(一)

1.初始阶段的网站架构 大型网站都是由小型网站发展而来,网站架构也是一样.小型网站最开始没有多少人访问,只需要一台服务器就绰绰有余. 2.应用服务和数据服务分离 随着网站业务的发展,越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足.这时就需要将应用和数据分离.这时需要三台服务器:应用服务器.文件服务器和数据库服务器,如下图.这三台服务器对硬件的资源要求各不相同:应用服务器需要处理大量的业务逻辑,需要更快更强大的CPU:数据库服务器需要快速检索磁盘和缓存,因此需要更快的磁盘和更大

大型网站架构演化发展历程

初始阶段的网站 小型网站没有多少人访问,一个机器即可:应用服务,文件服务,数据库服务.三个服务全部在一起. 应用服务与数据服务分离 随着用户量的增加,一个服务器已不能满足需求.这个时候将服务拆分,分别安装在三个服务器上:应用服务器,文件服务器,数据库服务器. 应用服务器需要对业务逻辑进行处理,对CPU的性能要求较高.数据库服务器对数据快速检索.保存等操作要求高,因而对硬盘和内存有很大需求. 文件服务器主要对磁盘要求较高. 使用缓存改善网站性能

系统架构演化历程

系统架构演化历程-初始阶段架构 初始阶段 的小型系统 应用程序.数据库.文件等所有的资源都在一台服务器上通俗称为LAMP 特征: 应用程序.数据库.文件等所有的资源都在一台服务器上. 描述: 通常服务器操作系统使用linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用Mysql,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了. 系统架构演化历程-应用服务和数据服务分离 好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,

linux基础学习-03-操作系统发展历程及系统版本选择

第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统的作用是管理和控制计算机系统中的硬件和软件资源,例如,它负责直接管理计算机系统的各种硬件资源,如对CPU,内存,磁盘等的管理,同时对系统资源供需的优先次序进行管理.操作系统还可以控制设备的输入,输出以及操作网络与管理文件系统

Linux 操作系统发展历程及系统版本选择

第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统的作用是管理和控制计算机系统中的硬件和软件资源,例如,它负责直接管理计算机系统的各种硬件资源,如对CPU,内存,磁盘等的管理,同时对系统资源供需的优先次序进行管理.操作系统还可以控制设备的输入,输出以及操作网络与管理文件系统

微博应用架构发展历程

整理资料找到了一份以前收藏的<微博应用架构发展历程>,是微博用户产品研发部的员工分享的.概述了微博从1.0到6.0的基本框架 版本回顾: V1.0 v2.0 V3.0 升级事项: • C重写Feed(ICEFeed)• 核?心服务多 IDC?支持 V4.0 升级事项 • 核?心服务迁移?至平台,平台化战略全?面启动• 设计全新框架(Swift框架),更OO,更简单• 引?入流?水线渲染(BigBipe),提升?用户体验 BigPipe渲染 v5.0 升级事项: • 应?用框架由Swift迁移?