📜  系统设计入门

📅  最后修改于: 2021-04-16 09:00:00             🧑  作者: Mango

系统设计是设计系统的体系结构,组件和接口,使其满足最终用户要求的过程。

它是工程学的一个广泛领域,包括各种概念和原理,可帮助您设计可扩展的系统。在各种技术公司的SDE 2和SDE 3职位面试回合中,都对这些概念提出了广泛的要求。这些高级职位要求您更好地了解如何解决特定的设计问题,在系统上的流量超过预期时如何响应,如何设计系统的数据库等等。在考虑可伸缩性,可靠性,可用性和可维护性时,必须仔细考虑所有这些决定。我们将在本文中介绍所有这些术语。

系统设计入门

在开始讨论术语之前,我们需要清除一些事情。当您遇到系统设计问题时,应该以计划的方式解决它。最初,问题可能看起来很大,并且人们很容易对如何开始解决问题感到困惑。而且,在设计系统时没有固定的解决方案。有多种方法可以达到解决方案。
因此,让我们讨论一个人应该如何开始解决面试中给出的设计问题。

处理设计问题

  • 解决问题:收到设计问题后,请开始将其分解为小组件。这些组件可以是您需要在系统中实现的服务或功能。最初,要设计的系统可以具有大量功能,如果是面试,则不希望您设计所有东西。向面试官询问您计划在系统中添加的功能。您还有什么要放的吗?有什么功能吗?有服务吗? … 问!
  • 交流您的想法:与面试官良好地交流。在设计系统时,请让他处于循环中。大声讨论您的过程。尝试通过流程图和图表在白板上清楚地展示您的设计。向面试官描述您的想法,计划如何解决可伸缩性问题,如何设计数据库以及其他许多方面。
  • 假设意义:请一些合理的假设,而你正在设计的系统。假设您必须假设系统每天将处理的请求数,一个月内进行的数据库调用数或缓存系统的效率。这些是您在设计时需要假设的一些数字。尝试使这些数字尽可能合理。用一些可靠的事实和数据来支持您的假设。

现在我们知道了如何解决设计问题。但是,为了成功进行面试或成功构建可扩展的系统,我们需要确保我们的系统可靠,可用,可扩展且可维护。因此,从长远来看,我们应该了解这些术语是什么以及它们如何影响我们的系统。

系统设计的可靠性–

当系统可以满足最终用户需求时,它就是可靠的。在设计系统时,您应该计划在系统中实现一组功能和服务。如果您的系统可以提供所有这些功能而又不会磨损,则可以认为您的系统是可靠的

容错系统可以是即使出现故障也可以继续可靠运行的系统。故障是在系统的特定组件中出现的错误。故障的发生并不能保证系统故障。

故障是系统无法按预期运行时的状态。它不再能够为最终用户提供某些服务。

系统设计中的可用性–

可用性是旨在确保商定的运营绩效水平(也称为正常运行时间)的系统的特征。对于系统而言,确保高可用性以服务用户的请求至关重要。

可用性的程度因系统而异。假设您正在设计一个社交媒体应用程序,那么就不需要太多的可用性了。可以容忍几秒钟的延迟。延迟5到10秒才能在Instagram上查看您最喜欢的名人的帖子将不是什么大问题。但是,如果要为医院,数据中心或银行系统设计系统,则应确保系统高度可用。因为服务的延迟会导致巨大的损失。

为了确保系统的可用性,应遵循多种原则:

  • 您的系统不应有单点故障。基本上,您的系统不应依赖单个服务来处理其所有请求。因为当该服务失败时,您的整个系统可能会受到威胁,最终变得不可用。
  • 检测故障并在那时解决它。

系统设计的可伸缩性–

可伸缩性是指系统应对不断增加的负载的能力。在设计系统时,应牢记它所承受的负载。据说如果必须为负载X设计系统,则应该计划将其设计为10X并将其测试为100X 。在某些情况下,您的系统可能会承受越来越大的负载。假设您正在设计一个电子商务应用程序,那么可以预期在Flash Sale期间或新产品上市销售时负载会激增。在这种情况下,您的系统应该足够聪明,可以有效地处理不断增加的负载,并使其具有可扩展性

为了确保可伸缩性,您应该能够计算系统将承受的负载。有多种因素描述系统上的负载:

  • 每天进入系统进行处理的请求数
  • 从系统发出的数据库调用数
  • 对系统的高速缓存命中或未命中请求的数量
  • 当前在系统上处于活动状态的用户