03.01 高并发网站架构的设计方案是怎样的?

xhide


大型网站遇到的挑战,主要是大量的用户,高并发的访问,就算一个简单的增删查改的功能,如果面对的是百万、千万甚至亿级的用户,都是一件难度很大的事情。


数据从数据库到浏览器的过程:数据库->应用数据集->内存对象->动态页面->HTTP服务器->用户浏览器。那么我们可以把高并发的设计分成几个层次:


前端

前端是指,用户的请求还没有到服务前的环节。

  • 浏览器缓存

  • 动静分离:静态内容部署在单独的服务器上;

  • 图片服务器分离:图片存储在单独的图片服务器上;

  • CDN:更智能的镜像+缓存+流量导流。


应用层/服务层

  • 负载均衡:后台应用部署多套,前面挂负载均衡,客户端都直接访问负载均衡,由它把访问分摊到实际应用服务器上;

  • Session管理:需要有专门的机制去管理Session,使集群内甚至跨集群的应用服务器可以共享;

  • HTML静态化:把连接后台数据库查询数据的工作提前做好,生成静态化的页面,那么访问的效率一定会提高很多;

  • 业务拆分:把一个打的业务系统,拆成多个小的业务系统;

  • 虚拟化:将一台物理机虚拟化成多台虚拟机,这样可以更高的支撑集群部署。

  • 消息中间件:使用消息中间件,比如各种MQ,业务系统之间使用异步消息发送以达到解耦的效果。

  • 各种缓存:一些语言框架本身就带缓存机制,也可以使用Memcached或Redis。


存储层

  • 数据库读写分离

  • 分库分表:一台数据库很难满足业务上的压力,那么数据库可以做分库分表。

  • 分布式文件系统

  • 非关系型数据库


其他必备的

  • 日志采集系统

  • 服务接口监控系统

  • 用户行为采集系统

  • 服务器性能监控系统

系统架构大了,部署的服务器多了,很多事情不可能通过人工完成了,比如一个接口调用发生了错误,不可能人工登录到服务器上去查日志吧,所以这些东西也是必不可少的。


都是说个大概,后面有机会的话,会把每一项都展开详细说明。

希望我的回答能够帮助到你!


会点代码的大叔


我们在做大型网站基础架构的时候一般来说软件架构需要关注性能、可用性、伸缩性、扩展性和安全性这5个架构要素。

我们通过这些架构要素来衡量我们整体系统架构设计的优劣,来判断是否达到了我们的要求。

高性能

性能是大型网站架构设计的一个重要方面,任何软件架构设计方案都必须考虑可能带来的性能问题,也正因为性能问题几乎无处不在,在请求链路的任何一个环节,都是我们去做极致性能优化方案中的切入点。


可用性

衡量一个系统架构设计是否满足高可用的目标,就是假设系统中任何一台或者多台服务器宕机时,以及出现各种不可预期的问题时,系统整体是否依然可用。


伸缩性

网站的伸缩性是指不需要改变服务器的硬件设计,仅仅靠改变应用服务器的部署数量,就可以扩大或缩小服务器的处理能力。

扩展性

不同于其他架构要素主要关注非功能性需求,网站的扩展性架构直接关注网站的功能需求。

网站快速发展,功能不断扩展,如何设计网站的架构使其能够快速响应需求变化,是网站可扩展架构的主要目标。


安全性

互联网跟传统软件不同,它是开放的,任何人在任何地方都可以访问网站。网站的安全架构就是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。

安全性架构,具体来说说就是保证数据的保密性、完整性、真实性、占有性。


总结

要完全掌握大型网站的架构设计方案,或许你可以点击我头像,进入我的专栏"深入大型网站核心架构实战"。

这期专栏是笔者总结了当下这些互联网行业中相对成熟且经过大型网站检验的技术和方案,内容涵盖构建大型互联网系统服务所需的关键技术。


笔者曾在多家一线互联网公司负责核心业务的架构设计与研发,对大型互联网服务架构有着丰富的实战经验,欢迎关注。

人人都是架构师


技术这玩意儿,你不深入使用它,你就不知道它有多牛,更不知道会有多难!

并发:指定时间段内的请求数!

高并发:指定时间段内的超多请求数!

比如tomcat,单机最大支持并发数为8000左右,redis理论值可达到几万!


那么怎么设计一套可支持高并发的系统呢?使用技术如下:

1,分布式系统,微服务:使用springcloud家族包括eureka,zuul,feign,hysrix等或者dubbo搭建一套微服务框架!

2,前后端分离:使用node.js搭建前端服务系统!

3,静态化处理:将页面,后台枚举,数据库定义表等使用静态处理方式做处理!

4,文件服务器剥离:采用单独的文件服务器,防止页面加载的阻塞!

5,缓存:使用redis,memcache等将运行时数据缓存,代替频繁的操作数据库!

6,数据库:读写分离或者分库分表,采用druid等有性能监控系统的数据库连接框架!

7,消息中间件:使用xxxmq,kafka等消息中间件,解耦服务,而且异步处理效率更高!


8,反向代理:使用nginx等负载均衡服务!

9,代码层:避免大量创建对象,避免阻塞IO,避免多层for循环,避免线程死锁,避免大量同步!

10,各种优化:包括jvm优化,表结构优化,sql优化,关键字段加索引(注意避免索引失效),连接池优化等等!

11,搜索引擎:sql有大量的like语句,有必要切换成solr等搜索引擎!

12,cdn:使用CDN技术将请求分发到最合适的主机上,避免网络传输的延迟!

13,使用batch:增删改能一次做的别分为两次,但要注意batch合理设计,防止数据丢失!

14,限流,削峰!

更多解决方案和每个方案细节实施涉及到的具体问题,以后会逐一分享!敬请关注!


分享到:


相關文章: