高可扩展性系统的设计(下)

简介: 高可扩展性系统的设计(下)

存储层的扩展性

无论是存储数据量,还是并发访问量,不同业务模块间量级相差很大。

比如知乎,关系数据量远大于用户数据量,但用户数据的访问量却远比关系数据大。所以假如存储目前的瓶颈点是容量,那只需针对关系模块的数据做拆分,而无需拆分用户模块数据。所以存储拆分首先考虑业务维度。

拆分后,这简单社区系统就有用户库、内容库、评论库、点赞库和关系库。这还能隔离故障,某库挂了不会影响到其它DB。

  • 按DB业务拆分后的部署架构
  • image.png
  • 业务拆分一定程度提升了系统扩展性,但运行久后,单一业务DB在容量和并发请求量上仍会超过单机限制。需针对DB做二次拆分。


这次拆分按照数据特征做水平的拆分,比如给用户库增加俩节点,然后将用户数据拆分库。


水平拆分后,即可突破单机限制。不能随意地增加节点,因为一旦增加节点就需手动迁移数据。所以长远考虑最好一次增加足够节点,避免频繁扩容。


当DB按业务和数据维度拆分后,尽量不要使用事务。因为当一个事务同时更新不同DB,需使用二阶段提交,来协调所有DB要么全部更新成功,要么全部更新失败。

业务层扩展性

一般从三个维度考虑业务层的拆分方案

  • 业务纬度
  • 重要性纬度
  • 请求来源纬度
  • 首先需把相同业务服务拆分成单独业务池,比方知乎,可按业务维度拆分成用户池、内容池、关系池、评论池、点赞池和搜索池。


每个业务依赖独自DB资源,不会依赖其它业务的。这样当某业务接口成为瓶颈时,只需扩展业务池,以及确认上下游依赖方,大大减少扩容复杂度。

还可根据业务接口重要程度,把业务分为核心池和非核心池。比如关系池:


关注、取消关注接口相对重要,可放在核心池

拉黑和取消拉黑的操作就相对不那么重要,可以放在非核心池里面

这可优先保证核心池性能,当整体流量上升时优先扩容核心池,降级部分非核心池的接口,从而保证整体系统的稳定性。


关系池拆分示意图

image.png

还可以根据接入客户端类型做业务池拆分。比如服务于

  • 客户端接口的业务可定义为外网池
  • 小程序或者HTML5页面的业务可定义为H5池
  • 内部其它部门的业务可以定义为内网池。

总结

未做拆分的系统虽然可扩展性不强,但简单,无论开发、运维都无需很大精力。拆分后,需求开发需要横跨多系统多团队,排查问题也需要涉及多系统,运维每个子系统都需专人负责,所以大厂招聘也都要求沟通协作能力强。


参考

https://www.infoq.cn/article/1w2MJZzx-0dm9j9VYSam

如何让系统易于扩展?


目录
相关文章
|
6月前
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
510 2
|
7月前
|
存储 分布式计算 负载均衡
HadoopHDFS的特点可扩展性
【5月更文挑战第11天】HadoopHDFS的特点可扩展性
171 1
|
消息中间件 存储 数据可视化
【结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性】
【结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性】
134 1
|
消息中间件 设计模式 缓存
聊聊结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性
聊聊结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性
|
存储 安全 算法
从系统复杂性看软件架构
一、架构设计是为了解决系统复杂性整个软件技术发展的历史,其实就是一部与“复杂性”斗争的历史。架构也是为了应对软件系统复杂性而提出的一个解决方案,其主要目的是为了解决软件系统复杂性带来的问题。这里包括两个名词:系统和复杂性,下面分别对其进行解析1.1 复杂性的定义复杂性这个名词很复杂,麻省理工学院的物理学家塞思·劳埃德统计了复杂性的定义数量,至少有45种:信息 ,熵 ,算法复杂性 ,算法信息量 ,费
10611 2
从系统复杂性看软件架构
|
存储 缓存 运维
系统稳定性设计原则:简单、冗余、标准化、健壮
系统稳定性设计原则:简单、冗余、标准化、健壮
681 0
系统稳定性设计原则:简单、冗余、标准化、健壮
|
存储 SQL 缓存
系统架构设计(3)-可扩展性
即使系统现在可靠,不代表将来一定可靠。发生退化的最常见原因是负载增加:并发用户从最初的10,000 增长到 100,000或系统目前处理数据量超出之前很多倍。
307 0
|
存储 缓存 负载均衡
系统设计:如何让系统容易扩展?
系统设计:如何让系统容易扩展?
411 0
系统设计:如何让系统容易扩展?
|
移动开发 运维 小程序
架构设计之高可扩展性(下)
架构设计之高可扩展性(下)
134 0
架构设计之高可扩展性(下)
|
存储 缓存 负载均衡
架构设计之高可扩展性(上)
架构设计之高可扩展性(上)
513 0
架构设计之高可扩展性(上)