写点什么

设计 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:554116
用户头像

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

关注

评论

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

58 K8S之集群日志系统

穿过生命散发芬芳

k8s 28天写作 12月日更

前端开发SpringBoot之接口文档的生成

@零度

前端开发 springboot

Linux之find命令

入门小站

Linux

Orillusion | 第一个WebGPU中文社区

Orillusion

WebGL 渲染 元宇宙 Metaverse webgpu

深入Java线程池:从设计思想到源码解读

Ayue、

线程池

风云再起之国产数据库风云榜-2021年12月

墨天轮

数据库 opengauss TiDB 国产数据库

在线JSON转Mongoose工具

入门小站

工具

遥遥无期

Tiger

28天写作

有没有好用的低代码平台,支持本地私有化部署的?

优秀

低代码 私有化部署

白帽近距离|TimeLine Sec安全团队威猛先生

火线安全

2022年之前,你不得不了解的一些 DevOps 趋势

飞算JavaAI开发助手

从了解洞态 IAST 到加入开源社区

火线安全

DevSecOps IAST

多因子认证是什么意思?与双因子认证有什么区别?

行云管家

身份认证 双因子认证 账户安全

艾瑞发布《2021 年全球互联网通信云行业研究报告》,融云持续领跑市场

融云 RongCloud

直播连麦的人工智能回声消除技术探索

融云 RongCloud

百度APP视频播放中的解码优化

百度开发者中心

视频 解码技术

25年,初心未改。

澳鹏Appen

人工智能 机器学习 训练数据 数据训练

大数据埋点如何实现、验证和管理

融云 RongCloud

融云荣获“2021 数字化服务创新成长企业”奖

融云 RongCloud

物联网之智慧农业应用分析&大数据之数据挖掘技术的应用

亚马逊云科技 (Amazon Web Services)

人工智能 云计算 大数据 物联网

Linux中如何设置SSH密钥提升登陆安全性

恒生LIGHT云社区

Linux SSH

行业分析| AR远程协助-企业的好帮手

anyRTC开发者

音视频 远程协助 远程医疗 远程培训

带你熟悉鸿蒙轻内核Kconfig使用指南

华为云开发者联盟

Python 鸿蒙 LiteOS-M Kconfig kconfiglib

应用落地 智创未来 | 2021新一代人工智能院士高峰论坛昇腾人工智能应用专场成功举办

OpenI启智社区

人工智能 昇腾

【架构师训练营】模块三作业

樰巳-堕~Horry

架构实战营 「架构实战营」

☕【权限设计系列】「认证授权专题」史上最全的权限认证服务的权限模型大全

洛神灬殇

架构设计 12月日更 权限设计 功能设计

泉州有几家正规等保测评公司?在哪里?叫什么名字?

行云管家

网络安全 等保 等级保护 等保测评

确保关键基础设施精确授时与同步的弹性、冗余和安全性

科技热闻

基于DataX的数据同步(上)-DataX介绍以及安装

恒生LIGHT云社区

MySQL 数据库 数据同步 DataX

恒源云(GPUSHARE)_有关【图像平滑】的论文小记

恒源云

深度学习 CV 图像处理

Token机制相对于Cookie机制的优势

郑州埃文科技

数据库 IP Token API

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