您现在的位置:主页 > 新闻动态 >

每个软件架构师和软件工程师都必须知道的10种设计模式

时期:2022-05-01 04:44 点击数:
本文摘要:https://ravindraelicherla.medium.com/10-design-patterns-every-software-architect-must-know-b33237bc01c2存在任何解决实际人类问题的业务。它可能是提高速度,降低成本,提高便利性,增加生活兴趣或使知识触手可及。通常用于解决这些业务问题的技术。可是,为什么设计模式很重要?IT系统的典型挑战是可用性,可伸缩性,弹性,数据治理,性能和宁静性。 在进入设计模式之前,弄清楚这些词很重要。

泛亚电竞

https://ravindraelicherla.medium.com/10-design-patterns-every-software-architect-must-know-b33237bc01c2存在任何解决实际人类问题的业务。它可能是提高速度,降低成本,提高便利性,增加生活兴趣或使知识触手可及。通常用于解决这些业务问题的技术。可是,为什么设计模式很重要?IT系统的典型挑战是可用性,可伸缩性,弹性,数据治理,性能和宁静性。

在进入设计模式之前,弄清楚这些词很重要。可用性: Availabilit Ÿ是一次系统的比例高达在界说的时间段。系统可能由于多种原因而停机,例如软件错误,网络问题,负载问题,DDos(漫衍式拒绝服务)攻击和基础架构硬件问题。可用性按以下百分比表现。

可扩展性:2014年,印度在线零售商Flipkart继续向客户致歉,因为十亿美元的大额销售由于可扩展性问题而无法满足客户的需求。可伸缩性是盘算资源,数据存储需求,消息通报基础结构和成本的一个因素。有两种方法可以解决可伸缩性问题。

第一个是垂直扩展,您将继续增加资源的容量,第二个是水平可扩展性,在此添加更多节点。这两种方法都各有利弊。通常,垂直缩放速度更快,可是在一定的时间点之外仍具有局限性,水平缩放会花费更多时间,而且靠近无穷大缩放。

可伸缩性是系统资源如何应对不行预测的客户需求。弹性:您继续在电子商务网站上购置手表。您不喜欢该设计,而且想要寻找更多选择。

您选择了几个带有设计,颜色,价钱过滤器的下拉框,然后单击搜索按钮。现在您会期望看得手表的图片,价钱数据,一些规格,例如表带质料类型,手表机芯,颜色,交货日期。如果交货时间微服务那段时间该怎么办?您现在有多个选择。完全不要显示该字段,而是显示一条静态消息“我们正在盘算准确的交货日期,请耐心等候”,否则您将选择一个日期规模并显示给客户。

弹性是系统能够妥善处置惩罚故障并尽快从故障中恢复的能力。数据治理:数据治理在可伸缩性,可用性,宁静性和弹性方面起着至关重要的作用。与数据治理相关的架构决议取决于您要构建的应用法式类型。它是繁重的(更多的用户事务),繁重的(陈诉),旨在举行分析(预测,客户细分),时间序列(日志处置惩罚)还是Datawarehouse(数据分析)。

影响数据一致性,数据可用性,数据存储和归档计谋的其他因素很少。性能:可伸缩性和性能是相互关联的。如果与系统可以处置惩罚的用户相比,有更多的用户,则系统自然会遇到性能问题。怎么处置惩罚呢?您增加资源或淘汰用户数量。

固然,第二选择不是理想的选择,因为您最终将失去业务。实际上,当您解决可伸缩性问题时,我们将解决这些性能问题。我只想提醒您,可伸缩性不能解决所有性能问题,但可以解决一些问题。

例如,如果性能问题是错误编写的DB查询的效果,那么在差池查询举行微调的情况下扩展资源将被证明是灾难性的决议。宁静性:建设宁静的系统可确保用户的数据宁静无虞。数据完整性和数据持久性同样重要。

这与将钱存入银行很是相似。如果您将一百万美元存入银行,您不想损失那笔钱(宁静),您会希望银行总是说您存了一百万美元-这里没有错(诚信),纵然十年后您也去了银行,您仍然会有那一百万美元的钱(耐用性)。现在您已经掌握了正确的基础知识,让我们一一先容重要的模式。

没有设计模式可以解决所有问题。需要凭据用例举行选择。可扩展性和性能CQRS:Greg Young首先引入了下令查询责任隔离。

顾名思义,它是关于区分写入和读取职责。可以从单个数据库或多个数据库举行写入和读取。可是数据模型是差别的。CQRS轻松适合事件源架构。

在事件发生时就将其消耗掉,并写入“ Write DB”中。出于显示或陈诉目的,请阅读“读取数据库”。为了使这一历程越发令人兴奋,您可以使用尺度化的RDBMS举行写入,而使用非尺度化的NoSQL DB举行“读取”。

通常,下令会排队等候异步历程,而且查询永远无法修改数据库。一个很是好的利益是您可以独立扩展数据库CQRS —下令查询职责隔离数据治理,宁静性2.反糜烂层模式:此模式最初由Eric Evans形貌在域驱动设计(DDD)中。让我用一个故事来先容一下。

Martin和Sheela在零售连锁店事情。Martin在客户订单团队中事情,Sheela在会员卡团队中事情。从DDD的角度来看,Martin和Sheela属于两个差别的领域,通常它们不会相互影响。

一天,Sheela希望对自己的系统举行更改。更改是要知道客户的位置,以便她可以凭据位置提供其他忠诚度积分。可是,她不认识马丁。

纵然她知道,Martin也可能差别意她的更改,因为他必须更改其API。可是,她知道Srinivas是Martin的司理。她找斯里尼瓦斯做改变。

在这种情况下,Srinivas是一个反糜烂层。当您拥有旧系统和现代应用法式而且正在迁移时,通常使用此模式。该层包罗转换现代系统的请求所需的所有逻辑。

引入这一层的最大挑战是,它将为用户增加一跳并增加延迟。必须在速度与数据之间做出决议。反糜烂层可靠性,容错能力3.断路器模式:在航行中旅行时,有一个氧气面罩和一个向西的生活,除了热情洋溢的空姐外,很少有人注意。

原因很显着。这些仅在发生故障时使用。您的基本假设是您的航行不会失败,不需要使用,因此您不会关注。

但这对于IT系统而言并非如此。“一切总是失败” – AWS CTO Werner Vogels我确定您听说过许多著名网站由于种种原因而倒闭。

在漫衍式情况中,任何时候都可能会失败。作为架构师,您无法制止失败。您只能设计用来处置惩罚故障。

断路器模式可防止应用法式执行险些肯定会失败的操作。让我解释一下。

您的系统突然遇到负载,而且API请求超出其处置惩罚能力。例如,服务的典型响应时间阈值为5秒,现在请求所花费的时间凌驾了该阈值,您的服务开始向后发送500个响应。除了给用户带来欠好的体验外,如果超出某个点的负载更多,您的系统可能会完全放弃。

现在该停止更多请求了。让我们将其与断路器的事情方式举行比力。你有没有遇到过?您刚打开电源插头,突然就没电了。

现在,您可能需要转到地下室或大厅中的总机,然后关闭已关闭的交流机。这是现实世界中断路器起作用的地方。这是在做什么 当负载很高时,将停止供电以防止进一步损坏。现在让我们回到我们的世界。

断路器模式具有三种状态。关闭,开放和半开放。

在关闭状态下,一切正常,而且系统按预期事情。泛起问题时,断路器打开,数据流中断。这意味着没有向用户提供预期的请求。Half Open在等候一段时间后实验测试水域,以检察问题是否仍然存在。

如果乐成,状态将变为关闭,以便系统恢复正常。如果不乐成,它将返回到打开状态。断路器-闭合状态断路器-开路状态可扩展性,弹性和性能4.事件源:随着数据成为新石油,这种模式在最近几天变得很盛行。

这种模式讲明,不仅要存储行动的状态,还应存储整个历史记载。假设您正在构建银行应用法式。客户在一段时间内将有多个借方和贷方。

假设客户的起价为$ 1000。第1天存入$ 50,第2天存入$ 100,第3天存入$ 150。

在第3天竣事时,她将获得$ 1100。可是,在使用事件泉源的情况下,您可以存储所有事务而不会丢失任何操作。拥有此数据后,可以用于多种目的。

通过运行中的快速盘算,您绝对可以在任何时间分辨出她的银行余额是几多,但您也可以相识她的银行模式,否则这是不行能的。运动采购让我们再看一个例子。

您正在构建影戏票预订系统。对于一部受接待的影戏,观众会看到许多慌忙,这将导致可伸缩性问题。客户可以预订,取消或持有座位。假设剧院有200个座位。

您需要不停盘算可用席位,以使下一个客户可以看到该席位。在这里,事件采购将很利便。您不必经由所有运动,最后得出一个数字,而不用像CRUD操作那样盘算可用座位。可伸缩性,弹性,容错性和性能5.公布者-订阅者模式这通常被称为公布/订阅模式。

在基于云的系统中,一个系统的模块需要与同一系统或另一系统的模块异步通信。让我举个例子。您正在建设一个休假治理系统。每当员工申请请假时,您都需要同时通知时间表模块,计划模块和薪资模块。

这可以通过异步伐用来完成。这些模块仅消耗数据。他们将不会验证数据。可是,当员工申请请假时,余额验证必须是同步伐用(通常是REST Api挪用),因为在没有余额的情况下员工不得申请请假(固然,要遵循组织的人力资源政策)这里另有一个例子。

想象您是一家新闻采购公司,而且您通过种种输入机制收集新闻。您的最终用户是报纸和出书公司。然后,您可以捕捉新闻并公布给客户。

如果您的客户是体育杂志,那么他们只会消费与体育相关的新闻;或者,如果您的客户是财经网站,那么他们只会使用与数据相关的财经。您的责任是捕捉世界上正在发生的事情而不会丢失任何事件。由客户决议他们要消费什么。

您还可以建立实例化视图以供进一步使用。如图所示的消息署理最适适用于异步通信。每当需要弹性和容错应用法式时,Pub-Sub模式就派上用场。

消息署理,Apache Kafka,Apache Active MQ,AWS Kinesis和IBM MQ有许多选项。Apache Kafka最受接待,以高性能和零数据丢失而著称。

可扩展性,数据治理和性能6.分片模式:如果您投资股票市场,这是一种久经磨练的计谋,即您不会将所有资金都投入到一只股票中。您将建立股票投资组合并举行投资。通过这种方法,如果一只股票价钱下跌,您仍然会让其他股票赚钱。

不要把所有的鸡蛋放在一个篮子里。分片接纳类似的方法。

在这种模式下,您将数据划分为多个分区或碎片。这极大地提高了可伸缩性。

这种模式属于水平可伸缩性,而不是垂直可伸缩性。如果数据存储在单个数据存储中会发生什么?与上述示例中的单个股票相同。如果数据存储泛起故障,您的用户将无法会见数据,从而造成许多贫苦。

凌驾某个点,您将遇到存储问题,盘算能力,网络和带宽问题。如果您要为差别位置的用户提供服务,则只有一个数据存储会增加延迟问题。分片可提高可伸缩性,性能和容错能力。

分片计谋有多种方法。该计谋与您的用例一起使用。基于规模的分片:假设您要存储客户数据,则可以思量凭据小我私家识别码或邮政编码规模举行存储。

此模型的缺点是您的客户数据可能漫衍不均垂直分片:如果要构建电子商务应用法式,则可以将客户人口统计详细信息存储在一个分片中,并将客户购置生意业务存储在另一个分片中。这为您提供了按需扩展的时机。基于哈希的分片:这是一种广泛使用的计谋。

如果您有5个分片来存储客户数据。您以客户唯一ID为例,并应用模5。现在为您提供一些有趣的数学。

如何盘算任意数量的Modulo 5。很简朴。假设数字为23。

将该数字除以5。您将获得4.6。现在取4乘以5。

获得20。现在获得23–20,获得3。

因此,谜底为“什么是23 mod 5?” 是3。从久远来看,基于哈希的分片将面临挑战。

如果您希望在一年后再添加一个碎片,该怎么办。您需要更改分片逻辑,而且数据存储中的容量会乱扔。解决方案是一致的哈希。

数据治理7. Strangler模式: Wikipedia的意思是Strangler是附生植物,其气生根最终将其生长的树木勒死。今天,险些每个组织都从单片服务过渡到微服务。

无论如何,这一旅程都不容易。从旧系统迁移到新系统时,系统地将功效迁移到新系统,而不是大手大脚的方法。如果要将遗留的单片应用法式迁移到云微服务应用法式,此模式将很利便。

最终,迁移竣事后,用户将直接与现代应用法式举行交互。在这种模式下,构建并迁移的小型功效(或微服务)最终会杀死主系统。

从中查找有关此模式的更多详细信息Martin Fowler的博客。数据治理,宁静性8. Saga模式:这是治理漫衍式系统中数据一致性的最佳模式。在使用Internet和WhatsApp之前,人们曾经亲自去亲戚和亲戚家旅行并发出完婚邀请。

这被视为令人敬重。无论如何,撇开这一点,如果婚姻突然取消怎么办?您不希望那天的亲戚和朋侪来。最好的方法是您再次前往每小我私家的住所,告诉他们婚姻已经取消。

(不是一个努力的例子。但这就是生活)。

这正是Saga模式。关于Saga模式的第一篇论文揭晓于1987年。

有两种方法可以实现Sagas模式。事件/编排设计和下令/编排排序逻辑。

编排设计很是庞大。让我们看一下下令/编排排序逻辑。我现在以机票预订应用法式为例。这是您预订航班的顺序。

选择座位(座位服务)选择膳食(膳食服务)支付预订用度(付款服务)现在更新可用座位以淘汰一个座位(预订服务)让我们看一下事件的顺序:预订服务会为用户生存一个可用座位,并要求Booking Saga Orchestrator(BSO)开始预订座位。BSO发送一个“待服务项付款”下令来支付服务,并将其与回复付款乐成的消息BSO向座位服务发送确认座位下令,并以座位确认消息回复BSO向“膳食服务”发送“预订膳食”下令,并回复“膳食确认”消息。假设付款服务失败。

您不想为客户提供免费座位和免费餐点。现在,BSO发送下令回滚座位预订和用餐预订。

可以在此处找到Saga模式的很是详细的说明可用性,弹性9.节省模式:如果您在优美的一天去过任何著名的印度庙宇,将有5万至10万奉献者。Darshan时间(在上帝眼前的时间)仅连续几秒钟,但他们在行列中花费4到8个小时之间的任何时间。寺庙治理通常通过将人群放在带有一些座位设施的小隔间中来控制人群。Lets说,在“ darshan”之前有20个隔室和一个最后的行列。

一个隔间可容纳约200人。随着时间的流逝,人们从隔间1移到隔间2,依此类推,直到到达最后的行列。

这称为节省。对于IT应用法式,大部门时间都是可以预测的,除非泛起一些黑天鹅事件。电子商务网站在节日期间或销售时会增加负载。

对于银行系统,在计入人为期间可能会有更多的肩负。对于时间捕捉系统,在早上,下午和晚上时间将泛起峰值负载。

处置惩罚这些峰值负载的一种方法是自动扩展资源。第二种选择是限制系统可以处置惩罚的事务数量,并开始限制剩余的事务。这样,就可以满足SLA,而且系统可以继续按预期运行。节省可用性,性能10.静态内容托管模式:在典型的网站上,稳定的内容称为静态内容。

通常使用HTML,CSS和Javascript建立。Javascript不是强制性的,也可以仅使用HTML和CSS(或Sass)。动态网站将具有在Web服务器上运行的逻辑,而且通常会对静态网站无法提供的数据执行CRUD操作。

动态网站取决于服务器端处置惩罚,包罗服务器端剧本,例如PHP,JSP或ASP.NET或Node.js。例如,您想在购置前知道产物的价钱,想支付电费,想在朋侪的时间轴上公布生日快乐,或者甚至很庞大,您想实施一个选择计谋股票。所有这些都需要一个动态的网站。

随着AWS的泛起,Azure和Google云平台的静态托管不需要您自己的服务器即可运行。例如,您可以在Amazon S3上托管静态网站(简朴存储服务),而无需分拆新服务器。

此外,您可以使用Cloudfront加速网站速度,该服务会将文件存储在靠近用户的边缘位置。


本文关键词:每个,软件,架构,师,和,工程师,都,必须,知道,泛亚电竞官网首页

本文来源:泛亚电竞-www.gzmet.com



Copyright © 2008-2022 www.gzmet.com. 泛亚电竞科技 版权所有 备案号:ICP备71849480号-3