<<架构师训练营>>第四周作业
一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。
主要分如下层面描述:
网络接入层
域名服务 DNS
DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。人们在通过浏览器访问网站时只需要记住网站的域名即可,而不需要记住那些不太容易理解的IP地址。
在 DNS 系统中有一个比较重要的的资源类型叫做主机记录也称为A记录,A记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的 IP 地址上。如果你有一个自己的域名,那么要想别人能访问到你的网站,你需要到特定的 DNS 解析服务商的服务器上填写A记录,过一段时间后,别人就能通过你的域名访问你的网站了。DNS 除了能解析域名之外还具有负载均衡的功能,DNS 域名解析负载均衡有如下优点:
将负载均衡的工作交给 DNS,省去了网站管理维护负载均衡服务器的麻烦。
技术实现比较灵活、方便,简单易行,成本低,使用于大多数 TCP/IP 应用。
对于部署在服务器上的应用来说不需要进行任何的代码修改即可实现不同机器上的应用访问。
服务器可以位于互联网的任意位置。
同时许多 DNS 还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样就可以加速用户访问,改善性能。
内容分发网络 CDN
内容分发网络(英语:Content Delivery Network或Content Distribution Network,缩写:CDN)是指一种透过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、影片、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。内容分发网络节点会在多个地点,多个不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。
负载均衡(硬件层面)
数据流量过大的网络中,单一设备一般是无法承担的,需要多台设备进行数据分流,而负载均衡器就是起到把数据分流到多台设备的作用。
硬件负载均衡设备是直接在服务器和外部网络间安装负载均衡硬件设备,这种设备我们通常称之为负载均衡器。由专门的设备完成,独立于操作系统,整体性能得到大量提高,加上更多的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。 一般来说,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵,很常见的有 F5负载均衡器。
负载均衡(软件层面)
软件负载均衡是指在服务器的操作系统上,安装软件,来实现负载均衡,如Nginx负载均衡。它的优点是基于特定环境、配置简单、使用灵活、成本低廉,可以满足大部分的负载均衡需求。
拿常用的 Nginx 举例, Nginx 的功能特点:
工作在网络的7层之上,可以做一些分流策略策略。
Nginx对网络的依赖比较小。
Nginx安装和配置比较简单,测试方便。
可以承担高的负载压力且稳定,一般能支撑超过1万次的并发。
Nginx可以通过端口检测到服务器内部的故障,提示负载节点是否正常。
不支持Session的保持、对Big request header的支持不是很好,另外默认的只有Round-robin和IP-hash两种负载均衡算法。
应用架构层
分布式应用开发框架
业务快速迭代和发展的互联网应用适合采用微服务应用来的方式来构建, 这样在合理拆分微服务之后能够使各个服务的开发团队职责"内聚", 使各个模块自身的迭代对其他模块的影响可控。
应用中间件(消息队列)
消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。
消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
应用中间件(网关)
网关承载着系统功能集合的接入,一个网关应该具备如下的能力:
接入流量的访问控制
接入流量的负载
请求路由
服务代理
请求监控
请求日志管理
应用中间件 (缓存)
在高并发的互联网中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的底层,系统是很难撑住高并发的冲击,所以分布式系统中缓存的设计是很重要的一环。使用缓存我们能够:
加速读写。因为缓存通常是全内存的,比如Redis、Memcache。对内存的直接读写会比传统的存储层如MySQL,性能好很多。举个例子:同等配置单机Redis QPS可轻松上万,MySQL则只有几千。加速读写之后,响应时间加快,相比之下系统的用户体验能得到更好的提升。
降低后端的负载。缓存一些复杂计算或者耗时得出的结果可以降低后端系统对CPU、IO、线程这些资源的需求,让系统运行在一个相对资源健康的环境。
日志管理
由于大型的互联网应用大多是采用微服务框架构建的分布式应用,其特点是多服务应用多实例部署,日志散落在不同的服务器中,一个完整的调用链可能会涉及到多个容器,查看日志比较不方便。需要在不同的机器上查看日志,这样子对于我们排查故障以及找到故障原因,就需要耗费比较多的时间,所以在大型的互联网应用引入日志管理方案是必需的。
监控系统
在一个大型分布式系统中,任何一个client的请求调用,会在分布式系统中产生上百次的调用(各种缓存、中间件、数据库、微服务),一旦一个请求异常,监控哪个系统服务发生了异常就变得尤为重。引入监控系统,能够有效地对系统的"健康"状况进行跟踪。
应用部署层
自动化部署
应用部署过程的每一个步骤都自动化,可以带来包括效能在内的显著的好处。
灰度发布
灰度测试就是将自己的产品首先拿出来给一部分目标人群使用,通过他们的使用结果和反馈来修改产品的一些不足,做到查漏补缺,完善产品的功能,使产品的质量得到提高。这样产品尽早的与用户接触能为以后产品的正式发布打下基础。
现在的许多互联网产品的用户规模都是非常大的,版本更新也比较频繁,每当有新版本进行更新或者上线的时候,新的版本都是要承受非常大的压力,而灰度测试则可以很好的规避这种存在可能性非常大的风险问题。
灰度发布能及早获得用户的意见反馈,完善产品功能,提升产品质量,让用户参与产品测试,加强与用户互动,降低产品升级所影响的用户范围。
持续集成
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
容器化部署
容器化部署消除了线上线下的环境差异,保证了应用生命周期的环境一致性标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。
服务的异地容灾
服务容灾的解决方案就是冗余。多几个备份来切换。常用的有N+1容灾和两地三中心。N和中心实际上都是机房的意思。所谓中心就是数据中心。N是数据中心的电力配置部分。电力配置有市电和备用发动机供电,但是一般互联网公司是不支持备用发动机供电的。所以一般一个机房就是一个N。N+1容灾就是要多出一个机房做容灾。而两地三中心,是提高了安全级别,除了同城两个中心外,在异地再多出来一个中心。如果整个地区市电都不供电了,还有个备份。异地容灾是提高系统可用性的一个手段。
评论