互联网架构演化( 三 )

 
随着业务越来越复杂,对功能和性能的要求也越来越高,最常见的便是数据库 like 语句性能已经无法满足需求;对于某些热点数据的访问,其性能也下降很快 。

此时,我们需要引入其他组件来有针对性的解决问题 。
 
5 引入搜索和缓存
针对数据库的 like 语句,通常情况下,是通过引入搜索引擎来解决;而热点数据的访问加速,是通过引入缓存服务来解决 。
互联网架构演化

文章插图
 
 
该架构的特征如下:
  1. 添加 搜索集群,用以提升数据检索性能;
  2. 添加 缓存集群,用以提升热点数据访问性能 。
在对数据查询进行优化后,慢慢的系统的写性能成为了瓶颈 。
此时,需要对数据的写性能进行扩展 。
 
6 数据库分库分表
随着数据量的增长,写请求量的增加,数据库的写入逐渐成为了瓶颈 。常规的写性能优化便是对数据库进行分库分表 。
互联网架构演化

文章插图
 
 
6.1 垂直拆分
将不同的业务数据放到不同的数据库实例中 。
 
6.2 水平切分
把同一个表中的数据拆分到多的数据库中 。
 
随着研发团队的规模越来越多,大家同时在一个项目中进行开发,导致频繁的冲突和相互影响 。
此时,会将整个应用程序根据功能模块进行拆分,从而形成多个子网站或子频道 。
 
7 应用垂直拆分
面对一个巨无霸式的应用,就像面对一团毛线团,总有一种无法下手的感觉 。对此,可以将其进行拆分,将其拆分为多个应用,每个应用独立开发、独立部署、独立维护 。
互联网架构演化

文章插图
 
 
该部署方案更加灵活,大大降低维护成本 。
  1. 通过不同的域名或 URL 将整个系统分解为多个子系统;
  2. 用户通过浏览器将各子系统拼接成一个完整的系统;
  3. 各系统间存在少量交互,甚至没有交互;
问题慢慢展现出来,系统间公共部分没有统一维护点,同样的功能、同样的代码分布在各个系统中 。
当然,我们可以通过发布 jar 包的方式,共享功能代码;但当 jar 升级时,就需要所有的子系统同步升级,运维开销巨大 。此时,我们需要引入服务化架构 。
 
8 服务化架构
我们可以将通用功能封装成一个服务,独立开发、独立部署、独立维护 。
互联网架构演化

文章插图
 
 
在该方案中,我们将业务逻辑进行了进一步拆分:
  1. 整理各个系统间通用业务功能,将其封装为服务,以承载核心业务逻辑,构建成 服务集群;
  2. 原来的子系统或子频道,变成薄薄的一层,不承载核心业务,只是根据业务流程对业务服务进行编排;
  3. 应用服务与业务服务间通过 HTTP 或 其他协议进行通信,常见的包括 Dubbo、Thrift等 。
服务化解决了系统之间的直接调用问题,也就是常说的 RPC,整个系统的协调点全部由应用服务完成 。这种架构适用于多种场景,但在一些需要异步处理的极端场景就显得有心无力了 。
此时,我们需要引入消息中间件 。
 
9 引入消息队列
服务化解决了直接调用问题,对于异步调用,最常见的便是消息中间件 。
互联网架构演化

文章插图
 
 
相比之前的架构,变化很小,只是在各个业务服务间添加了另外的一种调用方式 。
10 小结
冰冻三尺非一日之寒,一个大型系统的构建也不是一朝一夕的事情 。我们需要根据业务情况、数据量情况、请求量情况对系统进行合理规划 。
切记,架构不是越复杂越好,而是“适合自己的便是最好的” 。

【互联网架构演化】


推荐阅读