数据系统基础
互联网做得太出色了,以至于很多人把它看作某种太平洋一样的自然资源,而非人造。你还记得上一个达到如此规模而又这样健壮的技术是什么?
------------Alan Kay,Dr.Dobb杂志采访(2012)
何谓数据密集型系统?
对一个应用系统,如果‘数据’是其成败决定性因素,包括数据的规模,数据的复杂度或者数据产品与变化的速率等,我们就可以称为‘数据密集型应用系统’;与之对应的是计算密集型,cpu主频往往是后者最大的制约瓶颈。
可靠性
对于软件的可靠性,可以从以下几个方面描述:
- 应用程序执行用户所期望的功能。用户能够通过使用你的产品获得最基本的满足,比如通过微信能聊天,支付,通过京东能购物等,符合最初的预期。
- 可以容忍用户出现错误或者不正确的软件使用方法。对于错误的方法不至于导致软件的崩溃,能够通过指引继续或者通知用户由于什么原因不能继续。
- 性能可以应对典型场景,合理负载压力和数据量。对于突增的用户流量能做到降级,限流,扩容,不影响大部分用户的体验。
- 系统可防止任何未经授权的访问和滥用。做好软件的鉴权措施,保护用户的隐私,防止黑客的攻击
保证系统的可靠性,提高整体可用性,减少硬件,软件认为导致的故障,可以从以下几个点考虑:
- 增加冗余。可以通过数据备份,多地部署,以10倍流量部署机器等方式,当问题发生时,能及时恢复,减少故障时间。
- 熔断开关。当下游出现问题时,能对部分业务熔断处理,不影响整体系统的可用性。
- 限频。限频开关能够防止业务请求的突增导致业务的奔溃,特别是对于不能自动扩容的系统。即使是对于一些请求量稳定的业务系统,有时候也可能因为请求重试的放大导致系统奔溃,限频是对系统很好的一种保护
- 关键路径与非关键路径梳理并隔离部署,对于非关键路径可以进行降级处理。
- 解耦。对于一些可以异步处理的操作,比如消息通知等,通过mq异步处理,降低系统的响应时间防止被拖垮。
- 对于一些人为因素导致的系统不可用,可以通过充分的测试,比如对核心代码编写gtest单元测试,自动化测试等,完善有效的监控,加强风险意识的培训。
可扩展性
可扩展性是用来描述系统应对负载增加能力的术语。可以理解为当用户从1w/smin增长到100w/min时,系统是否还能正常运行。负载可以用称为负载参数的若干数字来描述。参加的最佳选择取决于系统的结构,它可能是web服务器的每秒请求处理次数,数据库中写入的比例,聊天室的同时活动用户数量,缓存命中率等。
当负载增加时,会关注系统的响应时间以及最终失败量。对于应对负载可以从垂直扩展和水平扩展两个方面考虑:
- 垂直扩展就是提高单机的性能,操作简单,不过成本很高。
- 水平扩展就是增加机器,优点是一般对机器要求不高,但是技术实现负载。分布式的系统通常都支持水平的扩展,在无状态的情况下可以支持自动扩容,能够很好的应对负载升高的情况。
可维护性
可维护性
方便运营团队来保持系统平稳运行
简单性
简化系统复杂性,使新工程师能够轻松理解系统。注意这与用户界面的简单性并不一样
可演化性
后续工程师能够轻松地对系统进行改进,并根据需求变化将其适配到非典型场景,也称为可延伸性,易修改性或可塑性
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。