架构师训练营 -W4-20200701
问:一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。
我理解一个典型的大型互联网应用系统,所面对的用户数量级应该是在千万到亿级之间,那么普通的单体架构性能基本是很难满足这个用户量的要求的,所以最主要还是要通过构建高可用和可伸缩的集群架构,来满足高并发的性能要求,同时还要能够满足一定的扩展性和对系统安全的要求。
根据我所参与的开发工作,集群架构最主要分为以下几个部分:
数据库
缓存
分布式服务
消息队列
负载均衡及网关
监控和维护系统
具体到每个部分又都有着各自所面对的核心问题,也就有着不同的集群设计和部署方案:
1、数据库
关系型数据库:我主要用到的有mysql、sql server。其中会用到的技术包括:连接池、主从分离,分库分表,发号器。
Nosql数据库:Redis、Hbase、MongoDB。nosql主要是配合关系型数据库来满足一些特定场景的读写性能,同时也提供优秀的横向扩展能力,非常契合大型互联网高并发大数据的特点。
分布式数据库:这部分我实际项目中并没有使用过,知道的有Oceanbase、GaussDB
其他数据库:ES之类的
2、缓存
缓存又分为静态缓存、分布式缓存和热点本地缓存这三种,
静态缓存:浏览器本地的HTML、CDN等
分布式缓存:Redis、Memcached等
热点本地缓存:我主要使用的是Guava Cache,其他的还有Ehcache
缓存使用的技术,主要有读写策略的选择、高可用方案、持久化方案,其中经典的缓存穿透问题、缓存击穿问题、缓存雪崩问题都需要单独考虑相关的解决方案。
3、分布式服务
这块最主要就是使用微服务的拆分改造了,相关的有Spring Cloud全家桶,我们公司有自研的一些中间件,基本上也都是按照流行的开源组件进行改造的。
我所理解微服务改造一个最重要的点是区分什么样的服务需要单独拆分,什么样的服务又是可以放在一起集中部署的,如何做到高内聚低耦合,做到领域划分等,这个比较考验架构师对业务的理解能力,如何拆分到恰到好处,能够在业务清晰的前提下,又能够方便开发。
分布式服务用到的主要技术点有:注册中心、服务治理、分布式事务、分布式锁、分布式trace、服务监控、熔断限流等等。
4、消息队列
主要就是kafka,以及各类mq,解决削峰填谷、异步、解耦等问题
5、负载均衡及网关
负载均衡主流的主要是LVS、Nginx,我们公司还有一层F5,有的时候也会进行一定的客户端负载均衡;
API网关分为入口网关和出口网关,入口网关主要是提供客户端一个统一的接入地址,同时也能够进行一定的服务治理策略,比如熔断、降级、流量控制和分流等。当然,很多时候,一些客户端的认证、黑白名单、访问日志也会放在网关中来完成。
6、监控及维护系统
监控主要有两种,一种是运维团队负责的服务器、存储等基础监控;还有一种是各类业务监控。正所谓“道路千万条,监控第一条,监控不到位,领导两行泪”。在服务层面一般需要监控四个指标,分别是延迟、通信量、错误和饱和度。
监控的目的是为了发现异常,那发现异常后就需要自动或者人工介入的维护了。目前大型互联网系统都会建立一套自动维护的系统,努力使系统能够高可用达到5个9就很厉害了。主要使用的基础方案就是冗余,服务器冗余,存储冗余,服务冗余,同时加上服务的熔断、降级、限流、超时等技术,基本上就能满足各类要求了。
版权声明: 本文为 InfoQ 作者【丁亚宁】的原创文章。
原文链接:【http://xie.infoq.cn/article/86e3073d254c05e87f978bf0a】。未经作者许可,禁止转载。
评论