QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

设计 Web 应用程序时要注意可伸缩性

  • 2010-09-03
  • 本文字数:2132 字

    阅读完需:约 7 分钟

Max Indelicato 是一位软件开发主管和前首席软件架构师,他最近发表了一篇关于如何设计具备可伸缩性的web 应用程序的文章。他提出要选择正确的部署和存储解决方案,选择可伸缩的数据存储和模式,并且使用抽象层。

适合工作的工具

Indelicato 的第一个建议是“为工作选择正确的工具”,想要达到这个目的,就要选择下列架构解决方案中的一种:

  • 使用云部署解决方案
  • 使用可伸缩的数据存储解决方案,像 MongoDB、CouchDB、Cassandra 或者 Redis。
  • 添加高速缓存层,像 Memcached。

他认为在开始开发应用程序的时候,这些解决方案并不是必须的,但是在开始时就选择可伸缩的数据存储解决方案是很明智的,因为那会避免之后再进行切换。将应用程序部署到云中会为我们带来一些好处,特别是对于创业公司来说,因为他们无法准确地确定他们的应用程序在启用之后会有多少人使用。将应用程序部署到云中之后,当需求增加时,就可以让应用程序以优雅的方式进行伸缩。很多软件架构师都讲述了他们不得不对应用程序进行扩展的事件,其中他们会引入高速缓存层,那会解决大部分问题。但是我们应该在设计阶段就考虑相应的解决方案。 这样在之后就很容易实现了。

可伸缩的数据存储

接下来,Indelicato 建议选择支持分区、复制并且有弹性的数据存储,包括以下几种: MongoDB、Cassandra、Redis、Tokyo Cabinet、Project Voldemort,或者选择 MySQL 作为关系型数据库。这是很必要的,因为不管怎样,在应用程序的生命周期中,分区都是必要的。对于可伸缩性来说,分区并不是必需的,但是对于“确保高可用性”就是必需的。灵活性可以让我们快速地增加更多的节点,这可能是出现流量峰值的时候,也可能是“由于硬件故障或升级、大型的伸缩模式的变更或者任何需要让节点下线的情况下,需要对节点进行维护的时候。”

可伸缩的数据模式

Indelicato 建议创建一种模式,从而让我们可以很容易地进行数据 sharding,他还给出了下面的临时组件的例子,User 和 UserFeedEntry:

复制代码
Collection (or Table, or Entries, etc) User
{
UserId : guid, unique, key
Username : string
PasswordHash : string
LastModified : timestamp
Created : timestamp
}<br></br>
Collection (or Table, or Entries, etc) UserFeedEntry
{
UserFeedEntryId : guid, unique, key
UserId : guid, unique, foreign key
Body : string
LastModified : timestamp
Created : timestamp
}

然后他建议根据 UserId 进行分区:

通过根据 UserId 字段对 User 集合和 UserFeedEntry 集合分区,我们会将两种相关的数据块放在同一个节点上。所有 UserId 为 xxx-xxx-xxx-xxx 的 UserFeedEntry 数据和 UserId 为 xxx-xxx-xxx-xxx 的 User 数据会被包含在同一数据片段中。

为什么这是可伸缩的呢? 因为我们对于这个应用程序的需求完全是针对数据的分发的。当每个访问者访问 User 的信息页面时,系统会向数据片段发出请求以获取 User 栏显示用户的详细信息,然后再向同一个数据片段发出请求以获得用户的 UserFeedEntries。这两个请求中,一个会获得一条数据,而另一个会获得多条数据,而这些数据都包含在同一数据片段中。 假设在一天之中对大多数用户的信息都有相同次数的访问,那么我们已经设计了可伸缩的模式,它会支持我们的 web 应用程序的需求。

使用抽象层

Indelicato 的最后一条建议是使用下述抽象层中的一种,但不仅限于这些: 元数据库(Repository)、缓存和服务。当创建元数据库层的时候,他建议:

  1. 不要以针对你所抽象的数据存储特有的方式来为方法命名。 例如,如果你抽象的是关系型的数据库,一般我们会为了执行 SQL 查询和命令而定义 Select()、Insert()、Delete()、Update() 函数。不要这么做。 相反,应该让你的函数名不那么专门化,可以使用 Fetch()、Put()、Delete() 和 Replace()。这会确保你更好地遵循元数据库模式,并且当你需要切换底层数据库的时候,工作会更简单。
  2. 如果可能的话使用接口(或者抽象类等等) 将这些接口传递给应用程序中更高的层,这样你永远不会直接引用元数据库的特定的固有实现。这对于构建和单元测试也是非常棒的,因为你可以编写其他固有实现,它们会预先带有与测试案例相关的数据。
  3. 将所有针对存储的特殊代码封装到一个类(或者模块等等)中,真正的元数据库会引用或者继承它。只在每个函数中放置针对存取函数所必需的细节(查询语句等等)。
  4. 时刻要牢记,并非所有元数据库都需要抽象相同的数据存储解决方案。只要你愿意,你可以将 User 存储在 MySQL 中,而将 UserFeedEntries 存储在 MongoDB 中,元数据库要以这样的方式实现,它们支持这么做而不需要付出太多代价。之前的三点建议也间接地有助于我们做到这一点。

Indelicato 说,对于高速缓存层,在开始时他经常会使用“简单的页面(或者视图等等)级别的缓存或者服务层的缓存,因为这是两个不会经常发生状态变更的区域。”

Indelicato 认为需要对服务层进行足够的抽象,这样当需求增加时,我们可以很容易地从服务的内部实现切换到进程之外的实现。

有些人认为在构建应用程序的时候不需要考虑可伸缩性问题,因为那会在必要的时候得到强调。 但是如果我们想要从开始就考虑可伸缩性,你还有什么好的建议呢?

查看英文原文: Designing a Web Application with Scalability in Mind

2010-09-03 19:554180
用户头像

发布了 340 篇内容, 共 134.3 次阅读, 收获喜欢 13 次。

关注

评论

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

现货合约量化交易系统开发搭建

薇電13242772558

数字货币 策略模式

阿里面试官纯手打:金九银十跳槽必会Java核心知识点笔记整理

Java架构之路

Java 程序员 架构 面试 编程语言

超强Android进阶路线知识图谱:Kotlin可能带来的一个深坑,持续更新中

欢喜学安卓

android 程序员 面试 移动开发

nodejs事件和事件循环详解

程序那些事

nodejs 异步编程 程序那些事 事件和事件循环 nodejs event

区块链大趋势

CECBC

数字经济

K线成交量管理系统开发、成交量管理系统开发

W13902449729

K线成交量管理系统开发 成交量管理系统开发

盘点2020|征文大赛获奖名单公布

InfoQ写作社区官方

盘点2020 热门活动

“区块链+数字身份”,道路坎坷前途光明

CECBC

数字技术

区块链发展应以密码应用创新为根基

CECBC

区块链 密码学

DeFi流动性挖矿管理系统开发|去中心化金融借贷系统开发

W13902449729

去中心化金融借贷系统开发 DeFi流动性管理系统开发

2021年编排将成为DevSecOps关键推动者

啸天

DevSecOps 应用安全 开发安全

厉害了!来看看这份超全面的《Android面试题及解析》,一线互联网公司面经总结

欢喜学安卓

android 程序员 面试 移动开发

案例研究之聊聊 QLExpress 源码 (六)

小诚信驿站

28天写作 QLExpress源码 聊聊源码

龙归科技 |软件的成本下降

龙归科技

身份认证 企业信息化 SSO

持续集成对IT团队和企业分别有哪些好处?

禅道项目管理

DevOps 运维 开发 CI/CD

为什么建议没事不要随便用工厂模式创建对象?

李尚智

Java 学习 设计模式

工作11年,从阿里P8出来,头发也没了,人也虚了,就剩下这份笔记了!

Java架构之路

Java 程序员 架构 面试 编程语言

细节!3部分讲明白HotSpot:运行时+编译器+垃圾回收器

996小迁

Java 架构 虚拟机 hotspot

音乐混音怎么做?教你完美制作野狼disco与周杰伦双节棍合唱!

懒得勤快

音频技术 音频制作 混音 音乐混音

Java 程序经验小结:类层次优于标签类

后台技术汇

28天写作

阿里2021年首次公开五份Java并发编程全彩小册:模型+原理+应用+模式+面试题五管齐下

Java架构追梦

Java 学习 架构 面试 并发编程

Hadoop的MapReduce到底有什么问题?

hanke

大数据 hadoop spark mapreduce 开源

Linux I/O 原理和 Zero-copy 技术全面揭秘

赖猫

c++ Linux linux编程 服务器开发 I/O

中美上市软件公司对比中的投资启示

ToB行业头条

五分钟快速掌握Maven的核心概念

Java架构师迁哥

字节内部MySQL宝典意外流出!极致经典,堪称数据库的天花板

比伯

Java 编程 架构 面试 程序人生

企业如何预防短信验证码被别人盗用

香芋味的猫丶

短信防刷 短信轰炸机 短信验证码 短信防轰炸 短信防火墙

Linux网络之 从 C10K 到 DPDK

赖猫

c++ Linux linux编程 C10K DPDK

在函数计算中到底该不该使用 VPC?

donghui

Serverless

WiFi6 与 5G 的异同分析

石君

5G wifi 28天写作

并发阻塞队列(BlockingQueue)— 生产者消费者模式核心部件

李尚智

Java 架构 jdk 设计模式

设计Web应用程序时要注意可伸缩性_架构_Abel Avram_InfoQ精选文章