架构师训练营 Week4 - 课后作业
题目: 一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。
解答:
先从一些形象的说起
1.集群
单个服务器能承载的访问量和业务处理能力是有限的,通过负载均衡服务器把访问服务请求分发到不同的服务器上解决高并发问题。
带来的复杂性及问题:服务器实例不可用的监控,以及对不可用实例的快速剔除。
2.缓存
从前端到后端有不同的缓存机制
浏览器缓存,CDN,反向代理服务器,一方面使用户就近访问到离自己最近的静态服务资源,提高应用的访问速度。另一方面,降低对应用服务器的访问压力。
应用服务器本机缓存,分布式缓存。将常用的数据资源缓存起来减少数据库的访问压力。另外内存的读取速度要快于远端数据库的查询。由于每台应用服务器的可用内存有限和减少每个应用实例重复缓存相同资源,就引入了分布式缓存。
带来的复杂性及问题:缓存的失效检测以及重载。高并发时的缓存击穿。
3.异步
利用消息中间件的一些特性提高系统可用性,消除高并发对系统负载的影响。
中间件,服务调用方和提供方通过中间件发送消息,调用解耦。
异步消息,服务提供方由被动调用变为主动接收请求,处理自己能力范围之内的负载。未处理的消息在消息队列等待。
持久化,当服务实例故障不能处理请求时,请求消息可以被临时保存在消息服务器不会丢失。
订阅-通知,通过消息中间件一对多的特性,当不依赖接收方回复是实现对多个订阅方的消息通知
带来的复杂性及问题:中心化,使所有服务的可用性同时依赖于消息服务器的可用性。不像简单的请求-响应模式,消息处理不当有可能会导致消息丢包,重复处理问题。
4.冗余
这一点要跟集群的概念分开来一点。冗余跟集群在某些方面可能是相同的,但是目标不同。
集群是为了解决单个服务器实例的负载问题,冗余则倾向于解决高可用性。像业界经常会提到的几个9的可问题,
数据冗余,解决数据丢失问题。
服务器冗余:解决单点故障问题。甚至将服务器部署在不同的数据中心解决容灾问题。
带来的复杂性及问题:数据冗余需要解决数据一致性问题。服务器的冗余需要在部署,管理,监控自动化方面要求更多。
5.自动化
DevOps可以说是自动化理念的产物。从开发到运维一系列的自动化使快速迭代,快速发布成为可能。
Maven, Docker, Jenkins 工具的使用,可以做到一键打包,一键部署、发布。
JUnit, SonarQube, Selenium框架工具,自动化测试从代码到功能性保证开发发布质量
带来的复杂性及问题:自动化可以算是理想状态,从开发测试环境切到生产环境,越接近实际环境自动化带来的风险/损失可能也就越大。人会出错,程序会出错,人设计出来的自动化程序也可能有错。完全把系统交给自动化程序带来了高效的同时,也会潜在着巨大的无人值守的风险。
评论