按关键词阅读:
全文共3050字 , 预计学习时长8分钟
文章插图
图源:unsplash
许多现代应用程序需要在企业级规模上构建 , 有时甚至需要在Internet规模上构建 。 每个应用程序都需要满足可扩展性、可用性、安全性、可靠性和弹性要求 。
本文中笔者将讨论一些能够轻松实现上述功能的设计模式 。 笔者将讨论每种模式 , 如何在云原生环境中使用以及该何时使用 。 其中一些模式并不是那么新颖 , 但是在当前互联网规模的云世界中非常有用 。
断路器
设计分布式系统时应考虑故障问题 。 现在全球已普遍采用了微服务 , 这些服务主要依赖于其他远程服务 。 由于网络、应用程序负载等各种原因 , 这些远程服务可能无法及时响应 。 在大多数情况下 , 重试能解决问题 。
但有时可能会出现一些重大问题 , 例如服务降级或完全服务失败 。 在这种情况下继续重试毫无意义 。 这就是断路器模式发挥作用的地方 。
文章插图
上图展示了熔断是如何实现的 , 其中当服务1发现在调用服务2时存在连续的故障/超时 , 服务1不会重试 , 而是会将跳转到服务2并返回回退响应 。 流行的开源库 , 例如Netflix’s Hystrix , 可以很容易地实现这种模式 。 如果您使用的是API网关或Envoy等Sidecar代理 , 则可以在代理级别本身实现 。
注意 , 在电路断开时要进行足够的日志记录和警报 , 以便跟踪在此期间内收到的请求 。 这一点十分重要 , 操作团队应该意识到这一点 。 还可以在电路半开路状态下采用断路器模式 , 从而为服务质量下降的客户继续提供服务 。
何时使用此模式:
· 当服务依赖于另一个远程服务 , 并且在某些情况下可能会失败时 。
· 当服务具有很高的依赖性时(例如 , 主数据服务) 。
【断路器、绞杀者、随航模式……专业结构设计模式知多少?】何时不使用此模式:
· 处理本地依赖项时——断路器可能会增加开销 。
命令查询职责分离模式(CQRS)
对于涉及数据存储的现代应用程序 , CQRS是非常有用的模式 。 它基于将数据存储区中的读取(查询)和写入/更新(命令)操作分开的原则 。
假设你正在构建一个应用程序 , 该应用程序需要将数据存储在MySQL / PostgreSQL等数据库中 。 众所周知 , 将数据写入数据存储区时 , 操作需要经过多个步骤——验证、建模和维持——因此 , 典型的写入/更新操作要比简单的读取操作花费更长的时间 。
当你使用单个数据存储并同时执行大量读写操作时 , 可能会出现性能问题 。 在这种情况下 , CQRS模式也许会大有用处 。 CQRS模式建议对读取和写入操作使用单独的数据存储 。
文章插图
如今大多数PaaS数据库都具有创建数据存储的只读副本(Google Cloud SQL , Azure SQL DB , Amazon RDS等)的能力 , 这有助于更轻松地实现CQRS 。 如果需要处理本地数据库 , 许多企业数据库也提供此功能 。 有些人还喜欢将只读副本实现为快速、高性能的NoSQL数据库 , 例如MongoDB和Elasticsearch 。
何时使用此模式:
· 打算扩展一个需要大量读写的应用程序时 。
· 想分别调整读写操作的性能时 。
· 读取操作正常且接近实时或最终一致时 。
何时不使用此模式:
· 在构建常规CRUD应用程序时 , 该应用程序一次不会进行大量读写操作 。
事件溯源(Event Sourcing)
事件溯源是一种有趣的设计模式 。 其中一系列域事件被存储为日志 , 日志的聚合视图给出了应用程序的当前状态 。 此模式通常用于无法负担数据库锁且需要维护事件审核和历史记录的系统 , 例如 , 酒店/会议/座位预订之类的应用程序 。
文章插图
假设有一个酒店客房预订系统 , 用户需要在系统中预订或取消预订 。 这需要将预订和取消作为一系列事件进行存储 。 在每次预订之前 , 查看活动日志就能显示可订的房间 。
大多数云服务提供商支持消息传递服务 , 如GooglePub/Sub、Azure Service Bus、AWS SQS等 。 这些服务结合了强大的一致数据库 , 可用于实现此模式 。
何时使用此模式:
· 当常规CRUD操作不足以满足要求时 。
· 通常适用于座位预订系统(如公共汽车、火车、会议、电影厅等)或由购物车、支付等活动组成的电子商务系统 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J291532020.html
标题:断路器、绞杀者、随航模式……专业结构设计模式知多少?