写点什么

针对可扩展的、高可用的云架构的模式与反模式

  • 2014-05-09
  • 本文字数:2089 字

    阅读完需:约 7 分钟

当设计一个具有高可扩展性和可用性的系统时,最重要的就是架构选择问题。以 Azure 客户的用法为例,微软讨论了与 Azure 客户一起看到的模式和反模式,以及它对系统架构的四个方面有怎样的影响:

  • 可扩展性:我能否增加资源以处理增加的需求?
  • 可用性:我的应用能否容忍短暂的和持久的故障?
  • 可管理性:我是否有办法了解生产系统的健康和性能?
  • 可行性:我能否在时间和成本预算之内构建和维护这个系统?

可扩展性

可扩展性来自于两个方面:资源和密度。能力是指增加额外的硬件,它可能微不足道(在一个负载均衡器后增加额外的网络服务器)也可能非常地困难(增加一个次要的数据库服务器)。密度是指你能以怎样的效率去使用已经拥有的能力。传统的性能调优可以大幅地增加密度。

附带报导:点钱照明

在演讲期间有一个共同主题是“点钱照明”。 Mark Simms 说,它的意思是无缘无故地做一些毫无效率的事。例子包括使用网络地址转换(NAT)去代替本身的负载均衡器,或者把 XML 作为内部数据交换格式。

可度量的资源

可度量的资源是某些需要小心监控的东西。举例来说,数据库连接就是一种可度量的资源。作为一种有限的资源,滥用它就会大幅度地降低密度。

以 Azure SQL 为例具体来说。它的标准版只允许每个数据库有 180 个连接。在 ADO.NET 中默认的连接池是 100。所以如果你有两个连接到 Azure SQL 数据库的网络服务器,并且这些网络服务器泄漏连接,那么你很容易就会超出限额。

其他可度量资源的例子还包括认证服务器和第三方网络服务。这些有时被称为“隐形的资源”,因为开发人员设计架构时经常会忽略掉它们。

通过队列负载均衡

上传时的峰值可能会成为问题,尤其是在那些针对大量读取工作负载优化过的系统上。一种降低这种峰值的方式是,通过使用队列以等待时间交换可用性。

在这种方案下,新数据在数据库中不是同步保存的。相反,它们会被放到一个队列中,这是个后台进程监控器。这个后台进程可以使负载趋于平滑,以便数据库始终会被使用,而不是某些时候忙,其他时候闲。

使用队列的其他好处是可以批量处理那些工作。一般来说,把信息批量写入到数据库中要比一次一条记录快得多。

最后要说的是,这还增加了解耦点。后台进程或数据库可以宕掉,完全不会影响前端应用接受新数据的能力。

改善消息队列的可用性

如果过多的消息是被同时接收的,可以使用辅助的消息队列去保存过量的部分。为了做到这一点,你需要设计应用能够支持多个队列,即使最初你打算只部署有一个队列的应用。

如果消息超出了应用能够处理的大小,避免数据丢失的一种技术是把消息写到 blob 存储中。然后队列中的逻辑消息改成了保存一个指向 blob 入口的指针,而不是原始信息。

网络服务器可用性

为了保持网络服务器的可用性,所有下游的调用一定要异步并有界限的。界限一定要在超时和并发请求这两个方面。后者经常被忽略。有一个多少会使人觉得有些尴尬的例子,那就是 Visual Studio Online 长达两个小时的运行中断。这次运行中断的根本原因就是对一个外部认证服务器有过多的并发请求,它已经临时地瘫痪了。

认证服务

这让我们引出了下一个主题——认证服务。当一台认证服务器瘫痪的时候,它完全可以被其他稳定的应用代替。因为这个原因,微软强烈推荐使用联合认证服务器。

记录错误的数据

大多数开发人员都很清楚需要去验证数据,但是当验证失败的时候,他们不知道做什么。仅仅弃掉数据和抛出错误是不够的。应该把错误的数据以它原有的格式记录下来,以便开发人员能够断定为什么会有这种错误的请求。

大多数错误的请求源自不匹配的版本。当用户拥有的客户端比处理请求的服务器的版本更旧(或者更新)时就会产生这种错误。

反模式:配置

微软的 Azure 团队评审客户端代码的时候,他们仍会看到硬编码连接字符串和其他配置数据。当配置需要修改成立即指向不同的硬件时,这可能就会成为一个现实的问题了。

反模式:假定数据库的可靠性

对于最新一代的程序员来说,数据库连接已经给定了。数据库和内网故障几乎从来都不会发生。所以开发人员通常都不会针对异常进行检查。或者即使他们做了检查,也不会正确地处理,然后数据就丢失了。

反模式:SQL注入

没错,这是个非常普遍的问题。在某些情况下,非常基本的网络请求他们都已经检查出有明显的 SQL 注入漏洞了。

反模式:向错误的资源写日志

日志的基础设施需要与应用栈的其他部分隔离开来。如果日志和产品数据一样写到同一个数据库中,丢失一个数据库必然意味着其他数据库也同样丢失了。

反模式:重抛异常

这个领域有两个常见的反模式。第一个是使用“throw ex;”重新抛出异常,而不是用“throw;”,导致堆栈跟踪被丢失了。第二个是重新抛出异常,但却没有更高层的处理去捕获它。在.NET 2.0 和之后的版本中,这必然会导致整个应用的崩溃。

可以在 Building Big: Lessons Learned from Azure Customers 的第九频道查看整个视频。

查看英文原文 Patterns and Anti-Patterns for Scalable and Available Cloud Architectures


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-05-09 00:021952

评论

发布
暂无评论
发现更多内容

2023秋招前端面试必会的面试题

coder2028

JavaScript 前端

ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具

华为云开发者联盟

人工智能 华为云 昇腾 企业号 2 月 PK 榜 华为云开发者联盟

前端二面经典面试题指南

hellocoder2029

JavaScript 前端

js作用域、作用域链和它的一些优化

hellocoder2029

JavaScript 前端

CDR2023安装下载教程及CorelDRAW功能介绍

茶色酒

CorelDraw2023

EasyRecovery16绿色版免费数据恢复软件下载

茶色酒

EasyRecovery16

即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]

JackJiang

网络编程 IM 即时通信

大咖说·图书分享|云存储:释放数据无限价值

大咖说

云存储

字节前端经典面试题(附答案)

hellocoder2029

JavaScript 前端

PingCAP 唐刘:一个咨询顾问对 TiDB Chat2Query Demo 提出的脑洞

PingCAP

TiDB

【立哥】【每日一个小知识】铁扇公主和太上老君到底是什么关系?

Lee Chen

将 Sentinel 熔断限流规则持久化到 Nacos 配置中心

做梦都在改BUG

Java 微服务 sentinel nacos Spring Cloud Aliababa

GitHub上线重量级分布式架构原理设计笔记,开源的东西看着就是爽

做梦都在改BUG

Java 分布式 微服务

NGINX Ingress Controller 在动态 Kubernetes 云环境中的性能测试

NGINX开源社区

nginx NGINX Ingress Controller 企业号 2 月 PK 榜

美团前端面试题集锦

coder2028

JavaScript 前端

在 CPU 上起舞:聊一聊Linux调度和Go的Runtime调度

蓬蒿

golang goroutine 协程原理 Linux调度 go 信号异步抢占

阿里大牛详细讲解:Spring Boot 集成Redisson实现分布式锁

做梦都在改BUG

Java Spring Boot 分布式锁

Nodejs:ESModule和commonjs,傻傻分不清

coder2028

JavaScript 前端

MatrixOne 0.7.0: 更稳定,性能更优

MatrixOrigin

数据库 分布式 MatrixOrigin MatrixOne

js函数式编程讲解

hellocoder2029

JavaScript 前端

使用JAVA读取和写入EXCEL文件

石臻臻的杂货铺

Java

设备用私有CA签发的X.509证书接入IoT物联网平台——实践类

阿里云AIoT

小程序 网络安全 物联网 智能硬件 数据格式

物联网平台华南1(深圳) 实例化开发实战——实践类

阿里云AIoT

监控 物联网 开发工具 智能硬件 消息中间件

EasyRecovery2023手机版数据恢复软件下载

茶色酒

EasyRecovery Photo16

云原生 AI 的资源调度和 AI 工作流引擎设计分享

百度Geek说

人工智能 云原生 企业号 2 月 PK 榜

koa实战

coder2028

JavaScript 前端

PGLBox 超大规模 GPU 端对端图学习训练框架正式发布

百度Geek说

百度飞桨 框架学习 企业号 2 月 PK 榜

全新CorelDRAW2023矢量图软件更新内容介绍

茶色酒

CorelDraw2023

模块2作业

王琨琨

MySQL性能指标TPS\QPS\IOPS如何压测?

做梦都在改BUG

Java MySQL 性能压测

针对可扩展的、高可用的云架构的模式与反模式_架构_Jonathan Allen_InfoQ精选文章