网站的核心要素之扩展性篇

网站的扩展性指:对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。变现在系统基础设施稳定不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。他是系统架构层面的开闭原则(对修改关闭,对扩展开放),当系统新加功能的时候,不需要对现有结构和代码进行修改。

注意其与伸缩性的比较:伸缩性是指,通过不断向集群中增加服务器,提高系统的业务能力,来应对不断变化的用户并发与业务需求。

一、降低服务之间的耦合性

如果模块之间不存在直接调用,那么新增模块或者修改模块就会对其他模块影响最小。这样系统的扩展性就会更好。

1、事件驱动架构 (Event-Driven Architecture,又叫做EDA)

通过在低耦合的服务之间传递时间消息,以保持模块的松散耦合,并借助事件消息完成模块间的合作。可以从两个方面来理解 EDA:

EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式。
EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式。

一个事件的产生可以触发一个或多个服务被调用,这样就把这些静态的功能动态地串联起来。服务除了完成特定的功能外,也可以根据自身需要产生某个事件。咱们可以简单的看一下这个图片:

2、分布式消息队列

队列是一种先进先出的数据结构,如果把这个数据结构独立的部署到服务器上,应用程序可以通过远程访问或操作。分布式消息队列可以很复杂(如esb消息总线)、也可以很简单(比如mysql存一条记录当做一个事件)。从专业的角度上讲,消息队列队列可以帮我们做很多事情,不仅仅是“事件驱动”,比如:

a、应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
b、异步处理:事件驱动。多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
c、限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
d、消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

具体消息队列可以参考从0说消息队列。咱们在选用消息队列的时候,注意对比,比如并发量,事务消息,消息确认、事务确认/发布确认等等。

二、利用分布式服务打造可以复用的平台

1、webservice技术与RPC

web服务曾经是企业级系统开发最时髦的词汇。现在web服务已经被大家广泛认知、认可、标准化的wsdl。但是,由于web服务的特性,还有一些问题没有解决、比如web服务通信效率较低(比较RPC的socket),web服务是基于http协议的soap协议,这种方式开销较大,性能较低。所以,现在新的时髦名词RPC出现了(rcp是基于socket的tcp协议,其性能比HTTP这种二次封装的协议强的多)。可参考:RPC的原理

2、大型网站分布式服务处的需求和特点

负债均衡、失效转移、高效的通信、整合异构系统、对应用入侵最少。

3、分布式服务的实现

目前主要是通过注册中心,对服务进行注册、服务之间通过RPC通信,在通过API网关进行负债、权限、限流、路由、熔断等手段处理,如下图

可参考:分布式微服务-API网关      RPC原理        注册中心可参考:consulzookeeper

三、可扩展的数据结构

使用关系型数据咱们可以保证关系运算的正确性,但是其僵硬的数据结构难以面对不断变化的“需求业务”。想象一下,每次有新需求,都需要加数据库字段,修改表结构,修改映射的实体,是不是很崩溃?那有没有颁发解决这个问题呢?无需修改表结构就可以新加字段?有:选择支持列族的NoSql。

使用支持ColumFamily(列族)的菲关系数据库的时候,创建表的时候,只需要指定列族名字,不需要指定字段名字,可以在写数据的在指定。通过这种方式,数据表可以包含百万的字段(你没看错,就是百万)。而在查询的时候,可以任意指定字段和值进行查询。

常见的NoSql:键值型数据库 (Redis)、文档型数据库 (MongoDB)、列存储数据库 (HBase)、图形数据库、搜索引擎(ES)

添加评论

Loading