试着探索高并发下的系统架构面貌

前言

之前端入行编码,可是对后端架构也很是感兴趣。一直以来都以为那些作到在洪水流量面前保持系统提供高可靠,高性能的服务的小哥哥们都很厉害。总想着去学习一番,所以大半年来不断学习后端相关的知识,试图去理解高并发架构的面貌。前端

固然,本文仅仅是试着探索而已,并无相关实践的经历,也只能从理论的角度去推演,从现有可参考的资料中去堆砌一个在我看来合理的架构方案。限于做者水平有限,所以不免行文不免有误,亦或是对整个系统的理解上理想化了,欢迎各位指出不足。同时,本文不会详实的阐述提到的每一个细节,由于自己本身对细节的把控也不到位,另外也是但愿你们可以在本文的基础上本身去详细了解这些技术。算法

图片描述

核心技术点

在做者看来,本文偏向于考虑如何作到高并发和高可用,所以一些性能优化的点则可能不做为重点言及,一是由于性能优化点过于繁多,会形成篇幅过长,另外也是由于具体的细节做者也未经实践不敢在这里细究。所以,列出如下这些在做者看来最为重要的核心技术点。数据库

  1. 智能DNS解析调度后端

  2. 负载均衡缓存

  3. 消息服务安全

  4. CDN配合对象存储服务性能优化

  5. Redis缓存服务器

  6. 分库分表网络

经过横向叠加机器解决并发突增问题,这是的架构设计的一项最基本要求。架构

技术详解

智能DNS解析调度

在全部用户的都是经过同一域名www.qq.com获取服务的状况下,想要将流量分散到多个负载均衡节点,必需要依赖DNS的解析。

DNS解析最简单的能够经过添加多条A记录将域名映射到多个IP地址来达到分流的目的。看到许多资料,每每只提到这个层面,而后抛出了问题:调度算法简单,每每是动态轮询,而部署的机器之间可能会存在性能差别或者当下健康情况不一样,简单的轮询并不能知足实际需求。
所以,通过一番搜索,发现了dnspod这样的第三方DNS解析服务提供设置权重,这样一来就能够针对机器的情况不一样进行不一样的权重配比。经过配比权重,基本上,就能够完成DNS解析的负载均衡了。

可是做者一直好奇,这些第三方的DNS解析厂商如何工做,所以在查阅资料以后,将原理总结以下:
在DNS解析中,咱们购买域名后,能够设置对应域名的权威DNS解析服务器。以访问www.qq.com.为例,DNS解析首先会递归查找对应域名的IP地址。一直查找到根域.,根域让咱们去问com.的权威服务器, 以后去问qq.com.的权威服务器,再问www.qq.com.的权威服务器,这时候咱们终于找到了www.qq.com.的权威服务器ns-edu1.qq.com.ns-edu2.qq.com.,权威服务器通过一系列算法最后给了咱们请求域名的IP地址。

DNS解析图

购买域名后,域名每每被默认的设置为平台默认的DNS解析服务器上,咱们也能够对其进行更改,好比设置到dnspod,并本身在dnspod进行配置。对于一些大厂,也能够经过自行架设DNS解析服务器并编写自定义的规则进行处理来达到高度定制化的管控。常见的管控以下:

  • 经过识别用户是电信网仍是联通网,将对应的网络内部署的服务器地址返回,以免用户请求的跨网,跨网会带来必定的网络传输性能的降低

  • 识别用户归属地,分配到最近的服务器以减小网络传输的距离

最后须要注意的是DNS解析的更改的实时性存在很大的限制,由于各地ISP服务商刷新域名DNS的时间不一致,因此致使解析在全球生效通常须要0-72小时。

负载均衡

这里的负载均衡只特指负载均衡的节点。DNS解析后的IP地址即对应负载均衡的IP地址,请求到达负载均衡节点后,将由负载均衡节点对请求进行转发到相应的http应用处理服务器。负载均衡节点能够设置相应转发的策略,例如最简单经过将用户的ip来hash到不一样的http应用服务器来分散压力,这样的好处是能够保证每次请求都打到同一台机器上。另外负载均衡节点也会监听应用服务器,而且及时隔离掉异常状态的服务器,在服务器恢复健康后,再次接入。

经过负载均衡节点接入多台应用服务器,当遇到促销等场景时,动态增长应用服务器便可知足需求。

此外,咱们还须要确保负载均衡节点的高可用性。经过VRRP(Virtual Router Redundancy Protocol, 虚拟路由冗余协议)保证负载均衡节点的高可用性。原理以下:
负载均衡节点每每由2台机器经过VIP(virtual IP,负载均衡向客户端提供服务的 IP 地址)技术向用户提供服务,两台机器同时只有一台机器保持在active的状态,两台机器之间经过Keepalived技术互相监听对方的状态,若是active的机器宕机,则另外一台机器自动切换到active的状态,经过冗余来保证负载均衡节点的高可用性。

消息服务

项目简单的时候,咱们每每会把全部的代码耦合在一块儿,同步执行。诸如购买一件商品,执行下单,减库存,支付等等操做同步运行完成以后再将请求返回,形成单个请求驻留时间过长,堆积大量的请求,形成应用服务器的不可用。

经过消息服务,咱们能够将这些服务解耦,而且经过将同步逻辑异步化,减小请求的驻留,从而减轻并发压力。用户操做产生消息,再经过创建另外的消费者进行消费。

咱们还能够根据状况,设置消费者的策略,好比,经过拉取消息而非推送消息,来保证不管前端并发多大的流量,均可以在消息服务这里熨平,消费者根据本身的能力拉取,不至于超负荷形成服务不可用。

CDN配合对象存储服务

CDN这个技术基本上写代码的人都知道,说优化的时候你们都能提到,但是过往也一直没有真正的设置过CDN的使用,此次专门去腾讯云上查看了下配置,并了解了下策略。

首先,用户准备一个域名用来做为CDN的分发域名,这里好比说qian-img.tenpay.com。设置qian-img.tenpay.com的别名CNAME为CDN厂商给咱们提供的域名好比说tenpay.com.CDN.dnsv1.com,以后还须要设置源站(ip/域名)即你静态文件实际存放的机器地址。这样对qian-img.tenpay.com的请求都会打到对应的CDN域名上,CDN域名也会解析到最近的CDN节点上,而且递归查找资源,相似于DNS解析。当没有找到资源的时候,才会去用户设置的源站IP上去获取资源。这样对本身的静态资源源站的性能要求会大大减小,系统性能也会大大提升。

而源站的资源管理上也推荐使用对象存储服务,相比与使用本身搭建服务器的文件系统。对象存储服务,也能够存储任意形式的非结构化的数据,而且高可用、高稳定、强安全。

Redis缓存

Redis是基于内存的键值对数据库,IO性能远远高于基于文件系统的数据库。对一个接口的请求的多个请求过程当中,每每数据并无产生变化,若是每次都去数据库中去查询,则会形成数据库压力过大,同时接口性能降低,经过将数据缓存在Redis这样的内存键值对数据库中能够大大提升系统的性能。

分库分表

经常使用的数据库诸如MySQL都是基于文件系统,而文件系统是基于磁盘,整个系统中,磁盘的IO能够说是最慢的一个地方。所以数据库每每是系统的性能瓶颈,分库分表,是最经常使用的策略。

单个数据库存在并发链接数上线单位是百,所以面对海量的请求,是无能为力的。所以须要经过分库来将压力分担到不一样的数据库机器上,以承载高并发的请求。分库的策略能够简单的根据用户UID的尾号进行水平拆分,同时分库后,单个数据库的记录数也减小了,读写性能也获得提升。

写在最后

大半年前,在公司听后端童鞋讲解后端架构的时候,不少东西都是一脸懵逼,大半年里不断认知学习,认识上终于有很多进步。学无止境,须要去学习的还有不少~行将毕业,7月入职,但愿在将来工做中可以在Web这一块有更加深刻的认识。

相关文章
相关标签/搜索