web服务端的架构演变
此文已由作者肖凡授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
最近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服务端的架构演变的更多相关文章
- Web服务端性能提升实践
随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...
- vivo 服务端监控架构设计与实践
一.业务背景 当今时代处在信息大爆发的时代,信息借助互联网的潮流在全球自由的流动,产生了各式各样的平台系统和软件系统,越来越多的业务也会导致系统的复杂性. 当核心业务出现了问题影响用户体验,开发人员没 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- winform客户端利用webClient实现与Web服务端的数据传输
由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- Delphi XE5通过WebService开发Web服务端和手机客户端
Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices stand-alone vcl applicati ...
- wsgiref手写一个web服务端
''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...
- 用于构建 RESTful Web 服务的多层架构
作者:Bruce Sun, Java 架构师, IBM 出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/ 用于构建 RESTfu ...
- Rsync同步部署web服务端配置
Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...
随机推荐
- 【paddle学习】词向量
http://spaces.ac.cn/archives/4122/ 关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...
- 转:libev和libevent的设计差异
转:http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese.html [ ...
- vc常用类总结(转载)
常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, i ...
- YII RBAC基于角色的访问控制
基于角色的访问控制( Role-Based Access Control ),是一种简单的而又强大的集中访问控制.基于Yii Framework 的 authManager 组件实现了分等级的 RBA ...
- Maple入门使用教程
http://anony3721.blog.163.com/blog/static/51197420105173915247/ 命令的运行:1.每条命令必须用":"(运行后不显示) ...
- JAVA BigDecimal 高精度运算
文章参考一位博友,由于时间太久忘了链接,见谅! public class BigDecimalUtils { private static final int DIV_SCALE = 10;// 除法 ...
- Ajax的简单实现(JQuary)
还是之前的例子,相对来说,用JQ就简单了很多,真的多,因为JQ直接把方法都写好了,直接调用就行了,,ԾㅂԾ,, php文件就不需要多做修改了,如下: <?php //改变Content-Type ...
- 关于用HOOK拦截键盘的一些问题
因为MSDN上说要这样做,所以我就这样做的,读懂MSDN是关键,下面来仔细阅读一下MSDN,看它到底是怎样描述的.阅读的时候我先给出原文,再进行自己的一些翻译或描述. 先看回调函数KeyboardPr ...
- var let Hositing const Temporal Dead Zone
var let Hositing const Temporal Dead Zone 临时死区
- XML-RPC JSON-RPC RPC是实现思路
XML-RPC - Wikipedia https://en.wikipedia.org/wiki/XML-RPC JSON-RPC - Wikipedia https://en.wikipedia. ...