【大型网站架构设计与方法总结】大型网站架构设计是一个循序渐进的过程,围绕“性能、可用性、伸缩性、扩展性、安全性”展开,下面是个人关于网站架构方面的一些总结,不到之处请大家多多批评 。
前端
- CDN加速:css/JS/图片等静态资源使用CDN加速,设置缓存时间、Referer限制(防盗链)等进行流量优化;
- 减少HTTP请求:将CSS/JS/图片等静态资源合并,可以利用webpack等前端构建工具进行处理
- 启用浏览器缓存和文件压缩:压缩图片、JS/CSS混淆压缩、Web服务器开启Gzip压缩&设置文件expire缓存时间;
- 异步加载:动态接口通过Ajax异步加载,减少网络请求(可以通过JSONP或者设置Access-Control-Allow-Origin进行跨域);
- 使用验证码:使用短信或图像验证码,提高验证码的复杂度及多样性,缓解羊毛党带来的流量冲击;
- 减少Cookie传输:Cookie包含在每次请求和响应中,太大的Cookie会严重影响数据传输,例如针对CDN采用独立域名,可以减少静态资源加载携带Cookie信息;
- 页面静态化:缓存整个页面,或者局部缓存,减少数据读取和运算频率;
- 数据缓存:充分利用NoSQL数据库,例如memcached、redis、mongodb等,可以部署集群或分布式缓存,提高缓存命中率,减少数据访问的压力,可以进行缓存预热、预先加载热点数据,同时需要防止缓存穿透;
- 异步解耦:利用Httpsqs、RabbitMQ、Kafka等队列或消息中间件,将耗时/非即时性操作通过队列进行异步处理,提高服务器响应速度,以此降低对资源的并发访问 。遵循一个原则:任何可以晚点做的事情都应该晚点再做 。
- 削峰填谷:由于流量是波动变化的,高峰和低谷差距很大,可以将一些操作存储到MQ队列中,消费端通过拉取的方式,并且拉去速度有消费端来控制,则就可以控制流量趋于平稳,达到了削峰填谷的目的,或者说起到了流控的目标 。
- 读写分离:利用MySQL主从复制机制搭建读写分离集群,在客户端实现或者服务端利用中间件(例如MyCAT)实现读写分离;
- 分库分表:针对不同业务类型,进行分库,部署到不同服务器上,减少单服务器压力,同时针对大表,根据一定条件(如用户ID取模、ID范围)进行水平分表,减少单表读写压力;
- 数据库连接池:充分利用连接复用,解决数据库连接过程需要占用资源,影响响应速度等问题,php本身没有连接池,可以利用第三方框架实现(例如SMProxy);
- 硬件优化:利用磁盘阵列(RAID)提升数据可靠性,资金充足的话可以换SSD硬盘;
- 业务拆分:根据URL拆分业务,分发流量到不同的服务器组,防止单一功能模块卡住,而影响整个业务,主要遵循SOA的架构思路,将业务模块打散(鸡蛋不要放在一个篮子里面)
- 反向代理负载均衡:充分利用Nginx/Haproxy/LVS反向代理负载均衡,搭建服务器集群,提升并发处理能力;
- DNS负载均衡:DNS解析可以依据不同网络运营商、地区进行分别解析、从而实现DNS层面负载均衡;
- 多线程:充分利用多CPU优势进行数据批处理
- 锁:在高并发情况下,对统一资源读写访问容易出现脏读、幻读,这个时候需要对核心资源枷锁,利用Redis或者Zookeeper等可以实现分布式锁;
- 设计模式:充分利用设计模式,实现逻辑解耦、分层和资源服用,例如单利模式、观察者模式等;
- 数据结构和算法:好的数据结构和算法可以给程序性能带来很大提升、例如链表查找、快速排序等;
- 垃圾回收:良好的编程习惯,例如即时清理内存占用大的变量、避免操作的数据量大等都可以避免出现内存泄漏(OOM)的情况发生 。
- SQL查询优化:SQL执行效率一般是影响响应速度的关键,可以开启SQL慢查询日志,对执行效率慢的SQL语句进行优化;
- GIT多分支:良好的分支管理对于CI/CD、版本测试有很好的作用,建议参考git-flow进行日常Git协作 。
推荐阅读
- phpStudy V8.0建立网站的方法及图文教程
- 大型毛绒玩具怎么清洗 不能拆的大玩偶怎么洗
- WordPress 网站地图 sitemap.xml 纯代码设置方法「亲测有效」
- 比1688还暴利的37个货源网站 暴利产品代发货平台
- 互联网架构“高并发”到底怎么玩?
- 程序员如何蜕变成架构师
- 优化WordPress网站的三个方法
- 浅析微服务架构下的网关设计
- 吉利CMA架构下首款轿车来了,英文名曝光
- 利用微信公众号+类豆瓣小组网站 打造正规自动赚钱系统