大型互联网应用系统主要使用了哪些技术和手段,解决了什么问题
首先,我们需要大概定义一下什么是大型互联网应用, 这个有很多标准,按照智慧老师总结的,大型互联网应用一般有以下的一些特点:
这些特点,其实也是大型互联网应用面对的挑战。为了解决这些问题,有一些通用的方案和思路。总结下来,有一些主要的方面:
- 分层
- 分割
- 分布式
- 集群
- 缓存
- 异步
- 冗余
- 自动化
- 安全
分层,其实是最常用的一种架构模式,在整个计算机体系的方方面面都体现着分层的概念。将整体系统拆分成 N 个层次,每个层次有独立的职责,多个层次协同提供完整的功能。
比如我们开发中常用的MVC架构
一般在规模比较小的情况下,我们可以将应用简单的分为三层:
表现层、逻辑层还有数据访问层
阿里发布的《阿里巴巴 Java 开发手册 v1.4.0(详尽版)》,我们可以将原先的三层架构细化成下面的样子:
- 终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。
- 开放接口层:将 Service 层方法封装成开放接口,同时进行网关安全控制和流量控制等。
- Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
- Service 层:业务逻辑层。
- Manager 层:通用业务处理层。这一层主要有两个作用,其一,你可以将原先 Service 层的一些通用能力下沉到这一层,比如与缓存和存储交互策略,中间件的接入;其二,你也可以在这一层封装对第三方接口的调用,比如调用支付服务,调用审核服务等。
- DAO 层:数据访问层,与底层 MySQL、Oracle、HBase 等进行数据交互。
- 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。
随着应用系统的发展,功能的丰富以及规模的不断扩大,分层的优势会越来越明显,主要体现在:
- 分层的设计可以简化系统设计,让不同的人专注做某一层次的事情。
- 分层之后可以做到很高的复用。
- 分层架构可以让我们更容易做横向扩展。
现在最流行的微服务架构,也可以按照分层的形式体现
在DDD领域,也同样存在分层架构
当然,分层也面临着一些挑战,最主要的是合理规划层次的边界和接口,在实际开发过程中,要严格遵循分层的架构和约束,禁止跨层次的调用和逆向调用。
(部分内容和图片选自高并发设计40问https://time.geekbang.org/column/article/138331
DDD实战课https://time.geekbang.org/column/article/156849)
分割,纵向方面对软件进行切分。将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,独立开发,独立部署。
我们在系统中的SOA,微服务拆分,应该都可以划分到分割的范畴。
分布式 分布式是一个很大的概念,会贯穿整个系统
常用的分布式:
- 分布式应用和服务
- 分布式静态资源
- 分布式数据和存储
- 分布式计算
- 分布式配置,分布式锁,分布式文件
集群
现在的系统,服务器基本都是集群化部署的。多台服务器部署相同的应用组成一个集群通过负载均衡对外提供服务。集群可以提高系统的并发性、可用性。
缓存
缓存在计算机系统中无处不在。对于大型互联网应用来说,尤其是很多读多写少的场景来说是提高响应的利器。在系统层面来说,缓存有以下几种:
- CDN
- 反向代理
- 本地缓存
- 分布式缓存
在使用缓存过程中,最重要的是缓存读写策略。可以参考https://thurstonzk2008.com/2019/10/29/%e7%bc%93%e5%ad%98%e8%af%bb%e5%86%99%e7%ad%96%e7%95%a5/
异步
业务之间的消息不是同步调用,而是将一个业务操作分成多个阶段,每个阶段通过共享数据的方式进行协作。
单一服务器内部可以通过内存队列方式实现。系统层面可以使用分布式消息队列(RabbitMQ,RocketMQ,Kafka等)
各类支持异步请求的框架,比如通讯框架netty
冗余
服务器的冷热备,多数据中心部署都属于这个范畴
自动化
DevOPS里很多流程是自动化的,自动化运维也是自动化的重要目标
安全
- web安全
- 服务器安全
- 数据库安全
- 网络安全
- 。。。