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 打开校验开关,强制对文件传输进行校 ...
随机推荐
- MySQL远程访问时非常慢的解决方案
服务器放在局域网内进行测试时,数据库的访问速度还是很快.但当服务器放到外网后,数据库的访问速度就变得非常慢. 后来在网上发现解决方法,my.cnf里面添加 [mysqld] skip-name-res ...
- h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片
得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...
- vs2010配置VL_FEAT库
VL_FEAT库是计算机视觉中的一个开源库,支持C/C++,Matlab,可以在http://www.vlfeat.org/下载. 本文主要讲一下VS2010中如何配置vl_feat库(算是对原文的一 ...
- [LeetCode] 038. Count and Say (Easy) (C++/Python)
索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 038. Cou ...
- mysql 免安装配置问题
摘要: MySQL是一个小型关系型数据库管理系统,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体 ...
- webservice client setTimeOut
一:eclipse生成的client,基于axis client_sub.getOptions().setTimeOutInMilliSeconds(1000*60); client_sub表示一个客 ...
- cocos2d-x交叉编译到安卓
ccocos2d-x是一个基于MIT协议的开源框架,用于构建游戏.应用程序和其它图形界面交互应用. 它的最大特点就是跨平台性,支持IOS, Android.Windows, WindowsPhone等 ...
- 关于static和const
先谈一下static, 它是一个存储修饰变量.被static修饰的变量存储在静态数据区,只初始化一次,保持数据的持久性.被static修饰的变量和函数有一个共同点是对其他的源文件不可见.被static ...
- NSString类的方法实现
创建一个新字符串并将其设置为 path 指定的文件的内容,使用字符编码enc,在error上返回错误 + (id)stringWithContentsOfURL:(NSURL *)url encodi ...
- redis13-----配置文件
==配置文件全解=== ==基本配置 daemonize no 是否以后台进程启动 databases 创建database的数量(默认选中的是database ) #刷新快照到硬盘中,必须满足两者要 ...