web集中式高并发架构设计

 

最近一直在研究高并发架构的设计,看了很多关于SOA设计思想,dubbo+zookeeper的分布式服务设计,mq等等,但目前项目处于初步期,还没上线,不能预估用户数量以及将来的并发数量,所以为了节约成本(老板吝啬),快速上线项目,我们项目依旧处于集中式,没有分模块,没有分表分库,只是提高了集中式项目的一个并发处理。

首先我们来看一下项目整体的架构(很不规范,凑合着看)web集中式高并发架构设计_第1张图片

 

我们先介绍下架构中的技术选型为什么这么选。

1.使用nginx进行反向代理实现负载均衡而不使用其他的。网上有很多种实现负载均衡的软硬件方案,其中F5,apache的负载均衡,lvs的负载均衡为什么我们都不选?F5,没钱。apache,复杂,在高并发上性能低于nginx。lvs,没怎么了解,直接抛弃了。

2.使用redis作为缓存。redis跟mencache,ehcache选哪个一直都是人们所头疼的。首先ehcache是存在于本地内存的,多个tomcat做负载的时候就特别麻烦了。mencache是支持多线程的缓存,但它只支持一种数据结构---key-value,这使我们在使用它的时候会有很多瓶颈。redis分布式缓存,提供了多种数据结构的存储,虽然它只支持单线程访问,但速度不亚于mencache。

3.mysql我们使用的是5.6的版本,主要是支持事务,颜表情等功能,没啥好说的

4.至于mysql主从处理(代码层),我们是在mybatis层面定义两个mapper,一个读,一个写,人工操作,没啥复用性,就是为了项目赶紧上线。(想实现高可用,随时加从库的话可以使用一些中间件,例如mysql-proxy,当然使用中间件效率相对就会下来一点)

接下来讲一下架构

1.首先我们前端是构造了一个虚拟IP(暴露给用户)进行主热双备,然后连接到一个nginx,在nginx进行请求过滤,比如恶意的压力测试之类的行为(百度有很多解决方案,例如lua脚本,redis黑白名单等)。通过nginx进行反向代理把请求分发给各个tomcat(可以通过配置权重,轮询方式配置分发),此处的tomcat可以根据需求设置多个(一台mysql大概每秒能撑2000个并发,所以自己看着办啦)。

2.到了tomcat层后,我们会先把请求分为两种,一种是查询请求,一种是更新请求。

   1)其中查询请求先会访问redis缓存(减少mysql压力,提高并发),若命中则返回数据给用户,若不命中则查询mysql(从库:myisam引擎,只读库,提高读取效率),并把查询结果set到redis中

   2)更新请求会发送到mysql(主库:innodb,保证事务,数据安全

3.由于我们项目对于实时性要求不是很高,所以此时可以不用考虑mysql主从复制时的延时性。(网上有很多种解决延时的方案,例如缓存,中间件等)

4.至于静态文件我们存放在自己构建的cdn上,也是为了提升访问效率

最后讲一下sql

1.设计表的时候适当的加些冗余字段,这样会少了很多的连表查询(当然冗余字段改变了对项目需求影响不大或冗余字段不会改变的情况下)

2.预估好字段大小,毕竟定义好字段大小后mysql就给该字段定义了相对大小的空间,定义过大会很浪费资源。当然也避免定义一些没用的字段

3.适当索引,当然跟废话差不多啦,加索引的技巧也很多,上网搜搜。

4.不是一条sql搞定全部就是好,有时候把大的sql拆分成小的sql效率会高很多

转载自:web集中式高并发架构设计

 

你可能感兴趣的:(分布式)