此文已由作者肖凡授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

最近Lofter项目碰到很多性能上的问题,特别是数据库相关的,每次推送后,告警就会第一时间到来。这些问题随着产品的不断扩展,我想大家肯定都遇到过。目前我们解决性能问题一般都是两种方法:一是加缓存,减少数据库压力;二嘛,就是加服务器了。如果产品的规模继续迅速增长,我们应该怎么做?靠增加服务器肯定不能解决根本问题,应该从架构上着手考虑。今天整理下web服务端架构从简单到复杂的一个演变过程,为今后Lofter的架构调整积累下经验吧。

第一阶段:web服务器和数据库分离

好吧,我们的产品肯定不在这个阶段。。。这个大家都知道就不多说了,直接上图:

第二阶段:增加缓存

一段时间之后我们发现我们的网站越来越慢,查找原因,发现是数据库的操作太频繁,导致数据连接竞争激烈,所以响应变慢,这个时候自然的会想到使用数据缓存,如redis、memcache等(最近lofter把memcache换成了nkv),减少对数据库的访问。另一方面,web服务器的负载也越来越大,我们需要对静态资源做缓存,可以使用反向代理服务器(通常的使用apache或nginx,lofter使用的是nginx);有时需要对某些特定的请求做缓存,比如lofter投放在网易163首页的iframe,访问量很大,也需要缓存,使用的是varnish。加入了这些缓存之后,架构变成如下:

第三阶段:增加服务器

这个阶段和上个阶段往往是同时进行的。需要注意的几个问题是:1、负载均衡,这个一般使用apache或nginx的负载均衡方案;2、如何保持状态信息的同步,可选的方案有cookie或统一session服务器等;3、如何保持数据缓存信息的同步,一般使用分布式缓存,如前面提到的memcache等

Lofter目前正处于这个阶段。这个阶段完了之后,架构如下图:

第四阶段:数据库分库、分表、读写分离

随着业务的不断增长,最先达到瓶颈的往往都是数据库,这个阶段基本上都是在解决数据库的性能问题。常用的方法就是:

1.先按业务逻辑分库,把不同业务的表放在不同的数据库中,降低数据库压力;

2.分库之后发现数据库的压力又慢慢上去了,往往都是大表造成的,这时候需要对大表进行分表,将大表拆成若干个小表;

3.如果数据库的读写比很高,通常还会考虑读写分离的方案

这个阶段需要注意的问题主要有:分库分表方案、数据如何路由、分布式事务如何处理等,大家可以参考淘宝的解决方案TDDL。这个阶段完了之后的架构图如下:

第五阶段:分布式时代

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 对云环境下访问控制系统的思考

web服务端的架构演变的更多相关文章

  1. Web服务端性能提升实践

    随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...

  2. vivo 服务端监控架构设计与实践

    一.业务背景 当今时代处在信息大爆发的时代,信息借助互联网的潮流在全球自由的流动,产生了各式各样的平台系统和软件系统,越来越多的业务也会导致系统的复杂性. 当核心业务出现了问题影响用户体验,开发人员没 ...

  3. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  4. winform客户端利用webClient实现与Web服务端的数据传输

    由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...

  5. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  6. Delphi XE5通过WebService开发Web服务端和手机客户端

    Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices  stand-alone vcl applicati ...

  7. wsgiref手写一个web服务端

    ''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...

  8. 用于构建 RESTful Web 服务的多层架构

    作者:Bruce Sun, Java 架构师, IBM 出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/ 用于构建 RESTfu ...

  9. Rsync同步部署web服务端配置

    Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...

随机推荐

  1. Linux网络驱动架构

    网络设备介绍 网络设备是计算机体系结构中必不可少的一部分,处理器如果想与外界通信,通常都会选择网络设备作为通信接口.众所周知,在 OSI(Open Systems Interconnection,开放 ...

  2. [CSS3] Identify Interactive HTML Elements with CSS Link Pseudo Classes

    The interactive pseudo-classes for links (and buttons) allow us to make sure the user knows what ele ...

  3. Katalon

    Katalon---一款好用的selenium自动化测试插件 selenium框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动 ...

  4. linux系列之-—03 压缩和解压缩命令

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  5. 线程池ThreadPoolExecutor分析

    线程池.线程池是什么,说究竟,线程池是处理多线程的一种形式,管理线程的创建,任务的运行,避免了无限创建新的线程带来的资源消耗,可以提高应用的性能.非常多相关操作都是离不开的线程池的,比方android ...

  6. 让你的eclipse实现写JAVA代码,HTML,CSS,JAVASCRIPT代码提示

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 改动Auto Activation triggers for java的值为:zj ...

  7. Tomcat 80端口 配置及域名访问步骤

    一.修改端口tomcat默认监听端口是8080,我们如果想不带端口的直接访问项目,就必须监听80 端口: service.xml 以下代码段 <Connector port="8080 ...

  8. C/C++用状态转移表联合函数指针数组实现状态机FSM

    状态机在project中使用很的频繁,有例如以下常见的三种实现方法: 1. switch-case 实现.适合简单的状态机. 2. 二维状态表state-event实现.逻辑清晰.可是矩阵通常比較稀疏 ...

  9. Deep Learning 36:python中的一些函数

    1.map(function, sequence[, sequence, ...])函数:返回一个list作用:map的作用是以参数序列中的每一个元素调用function函数,返回包含每次functi ...

  10. Qt & opencv 学习(二)

    例子:打开图片并显示.打开图片利用Qt的标准文件对话框,第一步是利用OpenCV创建窗口并显示. 添加一个Button,转到信号槽添加代码: using namespace cv; Mat image ...