高并发处理步骤

从处理技巧上,可以通过大牛学习高并发的架构,比如张宴: 张宴的博客 - Web系统架构与底层研发.至少你可以知道处理高并发的业务逻辑是:
  • 前端:异步请求+资源静态化+cdn
  • 后端:请求队列+轮询分发+负载均衡+共享缓存
  • 数据层:redis缓存+数据分表+写队列
  • 存储:raid阵列+热备
  • 网络:dns轮询+DDOS攻击防护

如何学习高并发的工具?
处理高并发的开源轮子其实很多.很多高并发的架构分享都会提及使用的工具,自己多留心,再看看手册,有条件自己搭起来跑一跑.
redis,nginx/Tengine,keeplive,DRBD,heartbeat这些小工具还是可以在虚拟机上面多开几台跑起来的.至于大业务场景,除了进大公司没有别的办法,因为有些工具运行的配置要求太高,必须多台服务器配合才能完成.

如何模拟高并发场景?
并不是只有实际生产环境才能测试高并发,其实模拟高并发的轮子也很多,最常用的apache benchmark,winrunner,loadrunner,这些教程很多,用来模拟基本的高并发业务绰绰有余,自己安装试用版,学学如何用,模拟些常用的业务.
如果有精力,业内很喜欢用perl,python,C来写一些针对热点业务的负载脚本.这需要有http协议等网络封包的理论基础.

一些建议
处理高并发要学习的东西实在太多.要在没有实际工作经验的情况下逐一了解太难,也很难深入.对于高并发的学习,我建议除了多阅读高并发架构的文档学习基本的方法论以外,自己要去深入学习网络基础,数据结构和算法.这些都是处理高并发热点的理论基础.

简单做一个归纳,从低成本、高性能和高扩张性的角度来说有如下处理方案: 
  1、HTML静态化 
  2、图片服务器分离 
  3、数据库集群和库表散列 
  4、缓存 
  5、镜像 
  6、负载均衡;一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。 

下面也是一个牛人所做的总结,跟上面部分相同。 
高并发时,性能瓶颈及当前常用的应对措施 


1.数据库瓶颈。Mysql并发链接100 

2.apache 并发链接1500 

3.程序执行效率 


1.有数据库瓶颈时,当前处理方案无外乎 主从,集群。增加memcached【内存对象缓存系统】

如:手机之家新系统介绍及架构分享(http://www.slideshare.net/Fenng/ss-1218991?from=ss_embed) 

就是在cache【缓存】层做优化 

又拍网架构(http://www.bopor.com/?p=652) 

是以增加数据库,分表分库的方法解决。 

Sina增加了mq(消息队列)来分发数据。 

还有风站用了key-value的数据库。其实这可以理解成一个持久化的缓存。 

2.apache瓶颈。 

增加服务器。负载均衡。如sina的F5 

由于进程数的限制。会把一些基本不变的代码挪出来放到单独的服务器。如css/js/图片。 

国内成功的案例是tom的cdn 


又如nginx的横空出世和squid的反向代理都是基于这个原因出来的。 


3.php的执行效率。原因有多个。 

1).本身的效率低。 

解决的成功案例是Zend Optimizer 和 facebooke的hiphop 

Taobao是把php代码编译成模块解决效率问题。 

2). 数据库查询效率问题。如可能有order by ,group by 等Sql数据问题。 

这个其实应该归结到数据库设计问题。 


解决的办法是建立正确的索引。增加memcache【分布式的高速缓存系统】.。 

对like表 用专用的sphinx.【SQL的全文检索引擎】和lucence 【基于Java 的全文信息检索】等搜索服务。 

程序员都应该会用explain对sql语句作分析。

Cache系统

在一些高并发高性能的场景中,使用cache可以减少对后端系统的负载,承担可大部分读的压力,可以大大提高系统的吞吐量,比如通常在数据库存储之前增加cache缓存。

但是引入cache架构不可避免的带来一些问题,cache命中率的问题, cache失效引起的抖动,cache和存储的一致性。

Cache中的数据相对于存储来讲,毕竟是有限的,比较理想的情况是存储系统的热点数据,这里可以用一些常见的算法LRU等等淘汰老的数据;随着系统规模的增加,单个节点cache不能满足要求,就需要搭建分布式Cache;为了解决单个节点失效引起的抖动 ,分布式cache一般采用一致性hash的解决方案,大大减少因单个节点失效引起的抖动范围;而对于可用性要求比较高的场景,每个节点都是需要有备份的。数据在cache和存储上都存有同一份备份,必然有一致性的问题,一致性比较强的,在更新数据库的同时,更新数据库cache。对于一致性要求不高的,可以去设置缓存失效时间的策略。

Memcached作为高速的分布式缓存服务器,协议比较简单,基于libevent的事件处理机制。

Cache系统在平台中用在router系统的客户端中,热点的数据会缓存在客户端,当数据访问失效时,才去访问router系统。

当然目前更多的利用内存型的数据库做cache,比如redismongodbredismemcache有丰富的数据操作的APIredismongodb都对数据进行了持久化,而memcache没有这个功能,因此memcache更加适合在关系型数据库之上的数据的缓存。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值