写点什么

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

  • 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:021870

评论

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

云桌面信息系统主要功能有哪些?

青椒云云电脑

云桌面 云桌面系统

云桌面科普

青椒云云电脑

桌面云 云桌面

如何分辨云桌面的基础架构

青椒云云电脑

桌面云 云桌面

以人机协同的方法轻松构建RAG模型

澳鹏Appen

大模型 LLM 大语言模型 rag 检索增强生成

阿里巴巴店铺商品API返回值中的商品分类与筛选条件

技术冰糖葫芦

API 优先 pinduoduo API

中小企业如何选择合适的云桌面供应商

青椒云云电脑

云桌面 云桌面厂商

Python Faker库造伪数据,使用CSV文件数据管理,faker数据唯一性

测试人

Python 软件测试 faker

电脑卡顿蓝屏?青椒云桌面如何释放硬件压力

青椒云云电脑

云桌面 云桌面厂家 云桌面系统

不同云桌面有哪些应用场景

青椒云云电脑

桌面云 云桌面

Swift语言中的Key-Path特性浅析

珲少

试用期被裁是有补偿的!一定要记得领取~

王磊

云桌面系统的运用优势有哪些?

青椒云云电脑

云桌面 云桌面系统

项目预算管理:减少估算误差的方法

爱吃小舅的鱼

项目预算管理

开源Embedding模型,有效提升中文语义理解与召回

合合技术团队

开源 文档 大模型

云桌面系统架构你了解多少?

青椒云云电脑

云桌面 云桌面系统 云桌面技术

云桌面解决方案厂商推荐?报价如何

青椒云云电脑

云桌面 云桌面解决方案 云桌面厂商

云桌面怎么开通?支持哪些外设

青椒云云电脑

云桌面

揭秘JDQ限流架构:实时数据链路的多维动态带宽管控|京东零售技术实践

京东零售技术

数据 JDQ kafla

2025中国(广州)国际喷码标识技术设备展会

秋硕展览

云桌面技术特点详细分析

青椒云云电脑

云桌面 云桌面系统

云桌面未来发展趋势解读

青椒云云电脑

云桌面

ETL集成工具丨如何运用ETLCloud单步调试断点功能

RestCloud

数据传输 ETL ETL数据集成 断点功能

云桌面怎么连接安装系统

青椒云云电脑

云桌面

【JVM】类加载子系统(类加载器、双亲委派)

不在线第一只蜗牛

JVM

议题征集|“智效融合,安全护航”第七期「度安讲」 技术沙龙议题报名!

百度安全

云电脑哪家好用?国产云桌面推荐

青椒云云电脑

云桌面 云电脑 云电脑平台

智能门锁展|2025年深圳国际锁具产业博览会

秋硕展览

云桌面怎么收费

青椒云云电脑

云桌面

体育直播用户需求趋势:新平台如何精准匹配观众期待?

软件开发-梦幻运营部

鸿蒙座舱:第三空间是一个缤纷多彩的万花筒

脑极体

AI

通过观测云对接企业消息中心,实现定制化告警通知

观测云

告警通知

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