对于⼀个应⽤系统,如果“数据”是其成败决定性因素,包括数据的规模、数据的复杂度或者数据产⽣与变化的速率等,我们就可以称为“数据密集型应⽤系统”,与之对应的是计算密集型(Compute-Intensive),CPU 主频往往是后者最⼤的制约瓶颈
数据系统基础
一、可靠、可扩展与可维护的应用系统
可靠性
可靠性:当出现意外情况如硬件、软件故障、人为失误等,系统应可以继续正常运转:虽然性能可能有所降低,但确保功能正确。
如何保障可靠性
-
最小出错方式设计系统,如精心设计的抽象层、API 以及管理界面
-
分离易出错地方、容易引发故障的接口,如提供一个功能齐全但非生产用的沙箱环境,使人们可以放心的尝试、体验,包括导入真实的数据,万一出现问题,不会影响真实用户
-
充分测试
-
快速恢复机制,滚动发布,数据校验
-
清晰监控
可扩展性
可扩展性:随着规模的增长,例如数据量、流量或复杂性,系统应以合理的方式来匹配这种增长。描述系统应对负载增加能力
描述负载:如 qps,数据库写入比例,聊天室的同时话动用户数量,缓存命中率等,平均值或峰值
Twitter 的例子,每个用户关注者的分布情况(还可以结合用户使用 Twitter 频率情况进行加权)是该案例可扩展的关键负载参数
两个业务场景:发布 tweet 消息,用户可以快速推送新消息到所有的关注者;主页时间线浏览,查看关注对象的最新消息
两个方案
描述性能:离线-吞吐量,在线-响应时间,sli,slo,sla,avg,p50,p99......
应对负载增加:垂直扩展,水平扩展,分布式系统
可维护性
可维护性:随着时间的推移,许多新的人员参与到系统开发和运维,以维护现有功能或适配新场景等,系统都应高效运转
-
可运维性:方便运营团队来保持系统平稳运行。良好的可操作性意味着对系统健康状况有良好的可观测性和有效的管理方法
-
简单性:简化系统复杂性,使新工程师能够轻松理解系统
复杂性的表现方式: 状态空间的膨胀,模块紧耦合,令人纠结的相互依赖关系,不一致的命名和术语,为了性能而采取的特殊处理,另解决某特定问题而引人的特殊框架
消除复杂性的手段之一:抽象。 一个好的设计抽象可以隐藏大量的实现细节,并对外提供干净、易懂的接口。一个好的设计抽象可用于各种不同的应用程序。这样,复用远比多次重复实现更有效率;另一方面,也带来更高质量的软件,而质量过硬的抽象组件所带来的好处,可以使运行其上的所有应用轻松获益
可演化性
- 可演化性:后续工程师能够轻松地对系统进行改进,并根据需求变化将其适配到非典型场景,也称为可延伸性、易修改性或可塑性