6种常用的架构设计模式(上)

2015-08-09

许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。


在本文中,我将谈论一些设计模式,这些模式可以帮助你轻松实现上述能力。我将讨论每个模式,他们如何在云原生环境中使用,以及何时使用和何时不使用。


有些模式也并不是什么新发明,但它们在当前互联网规模的云世界中非常有用。


以下是我将在本文中讨论的模式列表。


  1. 熔断器

  2. 命令和查询责任分离(CQRS)

  3. 事件溯源(Event Sourcing)

  4. Sidecar

  5. 后端对前端

  6. Strangler


下面进入正文。


熔断器


分布式系统在设计时应考虑到故障问题。目前微服务已经得到了广泛应用,这些服务大多依赖于其他远程服务。远程服务可能会因为网络、应用负载等各种原因而不能及时响应。在大多数情况下,通过重试应该可以解决这些问题。


但也有极端情况,比如服务降级或服务本身完全失效。在这种情况下,继续重试是没有意义的。因此熔断器模式就可以派上用场了。


熔断器


上图展示了熔断器模式的实现,当服务1了解到在调用服务2时有连续的故障/超时时,服务1不再重试,而是跳过调用服务2,并立即返回响应。


有一些流行的开源库,比如 Netflix 的 Hystrix,可以用来非常容易地实现这种模式。


如果你使用的是 API 网关或像 Envoy 这样的 sidecar 代理,那么可以在代理级别本身实现。


注意:非常重要的一点是,当熔断器打开时,要有足够的日志记录和警报,以便跟踪这段时间内收到的请求,并让运维团队了解到这些信息。


你也可以在半开的情况下实现熔断器,以继续为能容忍服务降级的客户提供服务。


何时使用此模式


  • 当一个服务依赖另一个远程服务,并且在某些情况下很可能失败时;

  • 当一个服务有很强依赖性时(例如:主数据服务)。


何时不使用此模式


  • 当你在处理本地依赖关系时,熔断器可能会产生开销。


命令和查询责任隔离(CQRS)


CQRS 对于现代使用数据存储的应用来说是一个非常有用的模式。它的原理是将数据存储中的读(查询)和写/更新(命令)操作分开。


假设你正在构建一个应用程序,需要将数据存储在 MySQL/PostgreSQL 数据库中。大家都知道,当向数据存储中写入数据时,一个操作需要经过几个步骤,比如验证、模型和持久化,因此典型的写/更新操作比简单的读操作需要更长的时间。


当使用单个数据存储同时执行读和写操作,并且访问量很大时,那么可能会开始遭遇性能问题。


在这种情况下,CQRS 模式可能很有用。CQRS 模式建议使用单独的数据存储来进行读和写操作。


CQRS


注:现在大多数 PaaS 数据库都提供了创建数据存储的读复制(Google Cloud SQL、Azure SQL DB、Amazon RDS等)的能力,这有助于更容易实现CQRS。


如果你处理的是私有数据库,很多企业数据库也提供了这个功能。


注:如今有些人也喜欢为读复制使用速度快、性能好的 NoSQL 数据库,比如 MongoDB 和 Elasticsearch。


什么时候使用这种模式


  • 当你正在考虑扩展一个期望有大量读和写的应用程序时。

  • 当你想分别调整读和写操作的性能时

  • 当你的读操作可以接受接近实时或最终一致性时


何时不使用此模式


  • 当你正在构建一个常规的 CRUD 应用程序,并不是每次都有大量的读和写的时候


事件溯源(Event Sourcing)


事件溯源是一种有意思的设计模式,在这种模式下,域事件的序列被存储为日志,日志的聚合视图给出了应用程序的当前状态。


这种模式通常用于那些无法承受数据存储锁的系统,并且需要维护事件的审计和历史记录,例如,酒店/会议/座位预订等应用。


事件溯源

比如一个酒店客房预订系统,其中用户需要预订或取消预订。在这里,你需要将预订和取消预订存储为一系列事件。在每次预订之前,通过查看事件日志,聚合视图显示可用房间。


注:大多数云服务提供商都支持消息服务,如 Google Pub/Sub、Azure Service Bus、AWS SQS 等。这些服务与强大的一致数据存储相结合,可以用来实现这个模式。


何时使用此模式


  • 常规的 CRUD 操作不能很好的满足需求时。

  • 通常适用于座位预定系统,如公交车、火车、会议、电影院等,或由购物车操作、支付等事件组成的电商系统。

  • 当需要强大的审计和事件回放来创建应用的当前和过去的状态时。


何时不使用此模式


  • 常规的 CRUD 操作足以满足用户需求时。


(待续)


原文链接:

https://medium.com/better-programming/modern-day-architecture-design-patterns-for-software-professionals-9056ee1ed977


参考阅读:





本文由高可用架构翻译,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


高可用架构
改变互联网的构建方式

长按二维码 关注「高可用架构」公众号

相关文章

【设计模式】各个击破单例模式的8种写法

2015-08-22
即「保证类只有一个实例」的设计模式就是单例模式.比如我们遇到过的各种Manager管理类,各种Factory工厂类;Spring 框架应用...

​我敢说,这是最全的常用设计模式汇总

2015-08-21
设计模式是面试中的高频问题,特别是像 BAT、TMD 这样的大公司,更加重视候选人的基本功,毕竟,你写出的代码足够“好”,是...

来吧,用设计模式来干掉 if-else

2015-08-20
我们需要对业务做好充分分析,避免一上来就设计模式,避免过度设计!END精彩推荐一百期Java面试题汇总SpringBoot内容聚合...

2W 字详解设计模式

2015-08-18
优质文章,及时送达原文链接:javadoop.com/post/design-pattern一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看...

9种设计模式在Spring中的运用,一定要非常熟练!

2015-08-18
来自:CSDN,作者:iCoding91链接:https://blog.csdn.net/caoxiaohong1005/article/details/80039656Spring中涉及的设计模式总结1...

降低中后台产品体验复杂性的设计模式

2015-08-18
所以为了平衡两个似乎相互矛盾的诉求,我们需要通过一套设计模式对我们的中后台产品体验复杂性进行有效的管理,让我们的设计产...

微服务架构及其最重要的10个设计模式

2015-08-18
作者 | TDS译者 | 孙微策划 | Tina微服务架构的十个设计模式分别是独享数据库、事件驱动、CQRS、Saga、BFF、API 网关、Strangler...

.net core 中的经典设计模式的应用

2015-08-18
.net core 中的经典设计模式的应用Intro前段时间我们介绍了23种设计模式,今天来分享一下 .net core 源码中我觉得比较典型的设计模...

Spring中经典的9种设计模式,一定要记牢!

2015-08-18
简单工厂(非23种设计模式中的一种) 实现方式: BeanFactory.Spring中的BeanFactory就是简单工厂模式的体现...工厂方法 实现方式: FactoryBean接口...单例模式 Spring依赖注入Bean实例默认是单例的...

你应该了解的5种TypeScript设计模式

2015-08-18
作者 | Fernando Doglio译者 | 王强策划 | 蔡芳芳本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享.设计模式是...

随机推荐

thinkphp6.0 最新教程资源

2020-09-08
《Thinkphp6.0正式版视频教程》 https://www.php.cn/course/1086.html《ThinkPHP6.0快速开发手册(案例版)》 https://www.php.cn/course/1049.html《ThinkPHP6.0技术文章》

PHP程序员最常犯的11个MySQL错误

2020-09-02
使用MyISAM而不是InnoDB MySQL有很多数据库引擎,但是你最可能碰到的就是MyISAM和InnoDB...使用PHP的mysql函数 PHP自产生之日就提供了MySQL库函数(or near as makes no difference)...没有处理用户输入 这或者可以这样说#1: 永远不要相信用户的输入. 用服务器端的PHP验证每个字符串,不要寄希望与JavaScript...

关于 PHP 错误日志踩过的一些坑

2020-05-23
phpinfo() 中 Local Value(局部变量)和 Master Value(主变量) 的区别首先说说这两个东西,phpinfo() 的很多部分有两个 ...

2018 年最新 PHP 面试题大全(干货)

2020-03-25
请自我介绍一下? 答:我叫 xxx,来自北京,20xx 年毕业于 xx 大学计算机 xx 系...cookiecookie 是由服务器产生,存储在客户端的一段信息.它定义了一种 Web 服务器在客户端存储和返回信息的机制...sessionsession 是实现购物车的另一种方法.session 提供了可以保存和跟踪用户的状态信息的功能...

温大网络工程专业:全球工程教育“第一方阵”,打造智网人才

2015-08-07
温州大学网络工程专业负责人施晓秋教授介绍说:“目前国内400多个网络工程专业点中,只有两个专业点成为既通过工程教育认证、...

浙江大学张帆等:CAESAR竞赛认证加密算法设计分析与安全性评估进展

2015-07-20
最后探讨了认证加密算法的设计和分析研究趋势.关键词CAESAR竞赛;认证加密算法;分组密码;序列密码;哈希函数;安全性评估...

数据库原理基础实验报告

2015-07-07
熟悉SQL Server 2008环境及SQL 语言 一、实验目的 1.了解SQL Server 2008配置管理工具、企业管理组件、管理...数据操作 一、实验目的 熟练掌握SQL语句对数据库的各种操作. 二、实验内容和步骤 使用SQL语言完成各类查询操作(单表查询,连接查询...

日料栈视频号 | 和碗丸聊金枪鱼(第一期)

2015-04-28
适合大家上下班或吃饭时看欢迎各位订阅日料栈的读者也关注一下日料栈视频号~有各种改进建议或者希望我们聊哪些话题都可以留言...

【微课期中讲堂】大话数据结构!

2015-02-23
微课期中讲堂大话数据结构为期中上机考助力!微课,让人人都能作学霸第一场周三下午两点17-19班 教二53320-22班 教二432串讲预...

我们真的搞懂这些排序算法了吗?(一)

2015-02-20
巨人的肩膀:《数据结构与算法之美》,《大话数据结构》,《算法》,《数据结构与算法分析》