当前位置: 首页 > 科技观察

6种常用架构设计模式之一

时间:2023-03-13 00:18:15 科技观察

许多现代应用程序需要构建在企业规模,有时甚至是互联网规模。这些应用程序都需要满足可扩展性、可用性、安全性、可靠性和弹性要求。在本文中,我将讨论一些可以帮助您轻松实现上述功能的设计模式。我将讨论每种模式,如何在云原生环境中使用它们,以及何时使用它们以及何时不使用它们。有些模式并不是什么新发明,但在当前互联网规模的云世界中非常有用。下面是我将在本文中讨论的模式列表。FuseCommandandQueryResponsibilitySeparation(CQRS)事件溯源(EventSourcing)SidecarBackendtoFrontendStrangler输入下面的文字。熔断器配电系统在设计时应考虑到故障。目前,微服务已经得到广泛应用,而这些服务大多依赖于其他远程服务。由于网络、应用负载等各种原因,远程服务可能无法及时响应。在大多数情况下,重试应该可以解决这些问题。但也有极端情况,例如服务降级或服务本身完全失败。在这种情况下,继续重试是没有意义的。所以保险丝图案就可以派上用场了。保险丝上图显示了断路器模式的实现。当服务1得知调用服务2时不断失败/超时,服务1不重试,而是跳过调用服务2,立即返回响应。有一些流行的开源库,例如Netflix的Hystrix,可以很容易地用来实现这种模式。如果您使用API网关或像Envoy这样的边车代理,这可以在代理级别本身完成。注意:非常重要的是,当断路器打开时,有足够的日志记录和警报来跟踪在此期间收到的请求并让操作团队了解情况。您还可以实施半开断路器,以继续为可以容忍服务降级的客户提供服务。何时使用此模式当一个服务依赖于另一个远程服务并且在某些情况下很可能失败时;当服务具有强依赖性时(例如:主数据服务)。何时不使用此模式断路器在处理本地依赖项时可能会产生开销。命令和查询责任分离(CQRS)对于使用数据存储的现代应用程序,CQRS是一种非常有用的模式。它通过分离数据存储中的读取(查询)和写入/更新(命令)操作来工作。假设您正在构建一个需要将数据存储在MySQL/PostgreSQL数据库中的应用程序。我们都知道,在将数据写入数据存储时,一个操作需要经过验证、建模和持久化等几个步骤,因此典型的写入/更新操作比简单的读取操作需要更长的时间。当您使用单个数据存储执行读取和写入操作并且访问量很大时,您可能会开始遇到性能问题。在这种情况下,CQRS模式可能很有用。CQRS模式建议使用单独的数据存储进行读取和写入操作。CQRS注意:大多数PaaS数据库现在都提供了创建数据存储(GoogleCloudSQL、AzureSQLDB、AmazonRDS等)的读取复制功能,这有助于更轻松地实现CQRS。如果您处理的是私有数据库,许多企业数据库也提供此功能。注意:今天有些人也更喜欢使用快速和高性能的NoSQL数据库进行读取复制,例如MongoDB和Elasticsearch。何时使用此模式当您考虑扩展需要大量读取和写入的应用程序时。当您想分别调整读取和写入操作的性能时当您的读取操作可以接近实时或最终一致性时不使用此模式当您构建常规CRUD应用程序时,并非每次都有巨大的事件源一种有趣的设计模式,其中一系列域事件存储为日志,日志的聚合视图提供应用程序的当前状态。这种模式通常用于无法承受数据存储锁,需要维护事件的审计和历史记录的系统,例如酒店/会议/座位预订应用。事件溯源就像酒店房间预订系统,用户需要在其中预订或取消预订。在这里,您需要将预订和取消预订存储为一系列事件。在每次预订之前,聚合视图通过查看事件日志显示可用房间。注意:大多数云服务提供商都支持消息服务,例如GooglePub/Sub、AzureServiceBus、AWSSQS等。这些服务与强大的一致性数据存储相结合,可用于实现此模式。何时使用此模式当常规CRUD操作不太适合您的需求时。通常适用于公交、火车、会议、电影院等座位预定系统,或由购物车操作、支付等事件组成的电子商务系统。当需要强大的审计和事件回放来创建应用程序的当前和过去状态时。何时不使用此模式当常规CRUD操作足以满足用户需求时。(未完待续)原文链接:https://medium.com/better-programming/modern-day-architecture-design-patterns-for-software-professionals-9056ee1ed977本文转载自微信公众号《高可用架构》",您可以通过下方二维码关注。转载本文请联系高可用架构公众号。