大型互联网应用系统技术方案和手段总结
缓存
互联网的场景下,基本都是读多写少的场景,为了减轻后端存储的压力并且加快访问速度,缓存是大型互联网系统最常见的优化手段。典型的有CDN缓存,远程Redis缓存,反向代理缓存,浏览器缓存,微服务本地缓存等等。
异步
互联网场景下,有大量使用分布式消息队列--MQ做异步的场景。常见的MQ有kafka,RocketMQ,RabbitMQ等等。使用MQ可以实现异步,削峰,解耦,限速等功能。
读写分离
因为互联网大多数场景是读多写少,使用缓存基本可以减少90%以上的db请求。但是缓存一般是有过期时间的,甚至有可能存在缓存穿透的问题。这种场景下打到db的读请求可能还是很多,对数据库造成非常大的压力。于是就可以采用这种读写分离的方案,根据实际数据库的读量,搭建一主一从或者一主多从等。
分布式服务
互联网迭代发布的节奏非常频繁,业务逻辑一般比较复杂。这种情况势必要把一个超大的单体应用就行服务拆分,按一定的原则拆分成多个功能相对独立并且逻辑比较单一的子系统,比如:登录,订单,资料,购物车等等,每个子系统单独部署自己的机器,方便后续的维护和扩展。
集群
服务拆分以后,单台机器可能还是挡不住所有请求。基于高性能和高可用方面考虑,需要把服务进行集群化部署后才能对外服务。
CDN
互联网面对的用户来自全国各地,全国各地运营商网络环境错综复杂。这时候把一些静态资源比如:html,js,css,图片等等放在全国各地的cdn上面,供用户就近访问,对用户体验的提升非常明显。
负载均衡
互联网场景下,所有对外提供服务的模块都是集群化部署的,此时,每台机器如何进行请求分配,就是负载均衡器所需要解决的问题了。典型的负载均衡有:dns轮询,F5,LVS,nginx负载均衡,dubbo框架软负载均衡等等。
NoSQL
典型的NoSQL有Redis,Memcached等key-value型数据库。和传统的关系型数据库不一样的是:NoSQL对事务性和一致性方面支持比较差,但换来的是极高的性能。
搜索引擎
对于那种商品搜索,订单搜索的场景,数据库like语句的性能表现不佳,此时引入专业的基于倒排索引的搜索引擎比如:ES,solr等可以极大地提升搜索性能和搜索质量。
分库分表
主要是解决关系型数据库在互联网场景下的海量数据以及高并发写入的问题。其中分表解决单表数据量过大后导致查询速度变慢的问题,而分库主要是解决单库在高并发写入的情况下扛不住的问题。常见的分库分表方案有:mycat,shardingJDBC和应用层分库分表。
限流
互联网经常有各种诸如秒杀类的热点,引发大量的突增请求。此时为了防止服务突然过载后雪崩,一般会引入一些限流的组件,常见的限流算法有简单计数器法,窗口计数法,漏桶算法,令牌桶算法等,各有优势。
分布式锁
锁是保护临界区资源的重要手段,服务集群化部署以后,以往的单机进程内锁可能就要改成分布式锁了。常见的分布式锁有redis分布式锁,zookeeper分布式锁等等。
评论