05如何让系统易于扩展

133 阅读2分钟

1.为什么提升扩展性很复杂

高可扩展性是一个设计的指标:可以通过增加机器的方式来线性提高系统的处理能力,从而承担更高的流量和并发

平时会预留冗余以应对分值流量

无状态的服务和组件更易于扩展,而像** MySQL 这种存储服务是有状态**的,就比较难以扩展。(瓶颈点,制约着横向扩展)

2.高可扩展性思路

**将复杂问题简单化:**拆分是扩展性的重要思路,将复杂的系统拆分成独立的,有单一职责的模块(通过对大模块进行拆分)。

不同类型的模块,拆分原则不同

举个栗子:

当前情况

社区模块:

  • 用户:负责维护社区用户信息,注册,登陆等;
  • 关系:用户之间关注、好友、拉黑等关系的维护;
  • 内容:社区发的内容,就像朋友圈或者微博的内容;
  • 评论、赞:用户可能会有的两种常规互动操作;
  • 搜索:用户的搜索,内容的搜索。

架构:

  • 负载均衡负责请求的分发
  • 应用服务器负责业务逻辑的处理
  • 数据库负责数据的存储落地

现状:

  • 业务代码耦合在一起
  • 数据也耦合在一起

image.png

2.1存储层的扩展性

根据业务维度进行拆分,根据实际场景进行拆分(关系数据量大,用户数据访问频繁)

image.png 当拆分后的数据库达到单机上限后,需要进行二次拆分

可以根据数据特征进行水平拆分:**分库分表(**做好规划后,避免扩容的成本过高)

最佳实践:不要使用事务,会导致二阶段提交

2.2业务层的扩展信息

拆分维度=业务维度(冒泡,发单,履约,结账,乘客中心)+重要性维度(core,other)+请求来源维度(乘客,司机,公用)

某个业务接口成为瓶颈后,只需扩容该服务和其上下游即可

image.png

核心池+非核心池(优先扩容核心池,降级非核心池接口)(保证系统的稳定性)

image.png

根据客户类型(外网池、内网池...)

3.总结

未做拆分的系统虽然可扩展性不强,但是却足够简单,无论是系统开发还是运行维护都不需要投入很大的精力。