系统设计基础—第 1 部分
系统设计基础—第 1 部分
原文:https://medium.com/hackernoon/fundamentals-of-system-design-part-1-c87b1d2bfd31
你可以在这里阅读本系列的上一篇帖子。
在设计系统时,有三个主要问题需要解决——可靠性、可伸缩性和可维护性。这些术语被频繁地使用,在这篇文章中,我想对它们分别进行阐述。
可靠性
可靠性是指系统容忍故障或问题以防止故障或完全停机的能力。大型系统是使用容错组件构建的。系统设计的美丽和艺术是使用不容错组件构建容错系统。
故障可以分为硬件故障和软件故障。例如,一个大型数据中心,硬盘的 MTTF 为 50-100 年,每天都会有磁盘崩溃。内存会定期损坏。硬件故障可以通过增加冗余来解决。例如,磁盘可以存储在 RAID 配置中,数据中心可以有多个电源备份,CPU 可以有热插拔支持。
软件故障可能由于多种原因而发生。一个失控的进程可能会占用您的系统资源,并导致所有节点系统崩溃,或者应用程序的运行假设可能会改变并导致崩溃。软件故障可以通过理解业务需求和建立弹性来处理与业务需求的偏差、更好的监控以尽早发布警告、更好的单元测试以及最后通过设计更好的抽象和接口来轻松隔离问题来处理。
可扩展性
可伸缩性是系统在面对增加的负载时提供合理性能的能力。系统负载可以用参数来描述,这些参数从技术上最好地解释了应用程序存在的理由。例如,对于一个社交网络网站,每秒写入(帖子)或读取(时间线视图中的帖子)的预期数量可以用来描述负载。您还可以考虑峰值读/写而不是平均值来描述系统上的负载。
当系统的负载参数发生变化时,性能可以看作是系统的运行特性。例如,您可以根据系统平均响应时间来衡量性能。您还可以根据响应时间的分布来衡量性能。因此,您可能认为第 99 个百分位数的响应时间小于 1 秒,平均响应时间为 300 毫秒。性能指标通常是您与客户的 SLA 的一部分。有许多方法可以实现系统的可伸缩性,我计划在本系列的后续文章中介绍这些方法。
可维护性
可维护性意味着编写的代码可以被不是代码原作者的人容易地理解、重构和升级。任何一段令人困惑的代码最终都会被机器理解。好的代码应该可读性强,容易理解,这样团队就可以协作。好的代码还应该有正确的抽象级别,干净的 API 和接口,这样新的功能可以很容易地建立在现有的代码基础之上。
点击此处链接阅读系统设计基础—第二部分