翻译:开源软件的架构(volume2): 可伸缩web框架及分布式系统

news2025/1/11 8:15:01

英文源地址
开源软件已经成为构建一些超大型网站的基础组成部分了.随着这些网站的成长, 围绕着它们软件架构的最佳实践与指导思想开始涌现.本文尝试去阐述设计大型网站时的需要考虑一些关键问题, 以及用于实现这些目标的基础组件.
本文主要关注web系统,尽管其中一些内容也适用于其他的分布式系统.

1.1 Web分布式系统的设计原则

构建并管理一个可伸缩的web网站或应用, 究竟意味着什么?从最基本的角度上讲,它只是通过Internet连接了用户与远程服务器资源, 使其具有可伸缩性的是在多台服务器上分布访问着的资源.
和生活中大多数事物类似, 在构建web服务时, 花一些时间提前规划从长远来看是有帮助的; 理解大型网站设计背后的一些考虑因素和权衡利弊, 可以促使构建规模较小的网站时做出更明智的决策.下面列出了一些主导大型可伸缩web系统设计的核心原则:

  • 可用性: 网站的正常运行时间对许多公司的声誉与功能至关重要.对于一些规模较大的在线零售网站, 即使是几分钟的无法访问服务也可能导致数千甚至数百万美元的收入损失, 因此,他们在设计系统时, 使其能够持续可用, 并能从宕机中恢复, 无论从商业上看还是从技术上看都是一个最基本的要求.分布式系统中的高可用性需要仔细考虑对于关键组件的冗余设计,部分系统故障时的快速恢复以及出现问题时的适当降级.
  • 性能: 网站性能已成为大多数网站的重要考虑因素.网站的速度影响使用率和用户满意度, 以及搜索引擎排名, 这个因素直接关系到收入(revenue)与留存(retention).因此, 构建一个可以快速响应请求和低延迟的系统是关键.
  • 可伸缩性: 当涉及到任何大型分布式系统时, 规模只是需要考虑的方面之一.同样重要的是当需要处理增加的大量负载时, 系统所需的额外容量(通常称为系统的可伸缩性).可伸缩性可以体现为系统的几个参数: 它能处理多少额外流量, 它增加存储容量有多便捷, 甚至于还能处理多少事务.
  • 可管理性: 设计的系统易于操作管理是另一个重要的考虑因素.系统的可管理性等同于操作的可伸缩性: 维护和更新.客观理性需要考虑的事情包括:当问题发生时, 易于诊断和理解问题, 易于更新或修改, 以及系统的操作有多简单(例如,它是否经常保持运转而不会受故障或意外的影响?)
  • 成本: 成本是一个重要因素.这显然包括硬件和软件成本, 但是考虑部署和维护系统所需的其他方面方面也很重要.系统构建所需的开发人员时间, 运行系统所需的操作工作量, 甚至所需的培训量都应该考虑在内.成本是拥有者的总成本.

这些原则中的每一条都为设计分布式web架构的决策提供了理论基础.然而, 它们也可能彼此冲突, 以至于实现一个目标是以牺牲另一个目标为代价的. 一个基本的例子: 选择通过简单地添加更多的服务器(可伸缩性)来解决容量问题, 可能会以可管理性(你必须操作一个额外的服务器)和成本(服务器的价格)为代价.
在设计任何类型的web应用时, 考虑这些原则都很重要, 即使在知道这样的设计可能会牺牲其中一个或多个原则的情况下.

1.2 基础

当涉及系统架构时, 需要考虑一些事情: 什么是正确的部分, 这些部分如何组合在一起, 以及什么是正确的权衡.
在需要扩展之前进行扩展通常不是一个明智的商业选择.然而, 对设计进行一些预先考虑可以在未来节省大量的时间和资源.
本节将重点讨论几乎所有大型web应用的核心因素: 服务, 冗余, 分区和故障处理.这些因素中的每一个都涉及选择和妥协, 特别是在上一节所述原则的背景下.为了详细解释这些, 最好从一个例子开始.

示例: 图像托管应用

某些时候, 可能在网上发布了一张图片.对于承载和提供大量照片的大型站点来说, 构建一个具有成本效益, 高可用和低延迟的体系结构是一个挑战.
想象一下,在一个系统中, 用户将他们的照片上传到中央服务器, 而这些照片可以通过网页链接或api进行访问, 就像Fickr或Picasa那样.为了简单起见, 我们假设这个应用有两个关键部分: 向服务器上传(写入)图像的能力, 以及查询图像的能力.有人需要下载存储内容时,需要足够快.
这与cdn网络很像
这样的制度的几个重要方面

  • 存储的图像没有限制, 因此要考虑图像数量方面的存储可伸缩性
  • 图像下载需要低延迟
  • 如果用户上传图像, 图像应该始终在那里(数据可靠性)
  • 系统应该易于维护(可管理性)
  • 由于图像托管没有很高的利润率, 系统需要具有成本效益.

全局缓存的两种方式
在这里插入图片描述
在这里插入图片描述

分布式缓存

每个节点都拥有缓存数据的一部分.通常, 缓存使用一致性哈希进行划分, 如果一个请求节点正在查找某段数据, 就可以快速知道在分布式缓存的哪里去查找, 以确保该数据是否可用.
这这种情况下, 每个节点都有一小节缓存, 然后在转到原始数据之前将向另一个节点发送数据请求.
因此分布式缓存的优点之一时增加了缓存空间.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全-01-VMware安装Kali部署DVWA

网络安全-01-VMware安装Kali&部署DVWA 🔻一、Kali简介&下载📗 二、VMware安装Kali📰 2.1 新建虚拟机📰 2.2 开始安装Kali📰 2.3 更换apt源为国内源📰 2.4 启动mysql-这里使用自带的maridb&#x1f…

【Python 垃圾回收】零基础也能轻松掌握的学习路线与参考资料

Python 垃圾回收是 Python 运行机制中的重要环节。了解 Python 垃圾回收机制可帮助开发者高效编写 Python 代码,并避免潜在的内存泄漏问题。本文将介绍 Python 垃圾回收的学习路线,并给出参考资料和优秀实践。 Python 垃圾回收机制 Python 使用引用计数…

关于社会脑研究的fMRI和fNIRS超扫描方法

导读 近来,“社会脑”(即大脑在社会情境中是如何工作的,以及我们社会行为的机制是什么)在神经科学文献中获得了很多关注,主要是因为最近开发的技术允许研究人类社会认知的不同方面及其与大脑的关联。在这种情况下,超扫描技术拓宽…

如何在华为OD机试中获得满分?Java实现【质数因子】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 功能:输入一个正整数,…

vue小案例TodoList

1.首先我们分析怎么把一个页面拆成多个组件,如下图,我们可以拆成MyHeader、MyList、MyItem、MyFooter,其中MyList包含MyItem 2.观看如下代码(我们把MyItem作为MyList的子组件,在父组件中使用v-for指令来循环展示子组件…

【java基础】Map集合

大家好👋,今天我来给大家科普一下Java中的map集合。map是Java中非常重要的数据结构之一,经常被用于存储键值对。 【有关这部分知识的思维导图放在文章末尾了,需要的C友请自取】 正文开始: 一、Map集合概述 我们知道&…

柱状图中最大的矩形

题目链接 柱状图中最大的矩形 题目描述 注意点 无 解答思路 暴力破解根据每根柱子x以x的高度作为矩形的高度找到其相邻能组成矩形的柱子,遍历所有柱子即可找到最大矩形,但是时间复杂度是O(n),最终运行结果也超时了上面暴力破解的方法中…

MKS SERVO4257D 闭环步进电机_系列4 MODBUS指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&am…

基于Android的视频分享平台的设计与实现

基于Android的视频分享平台的设计与实现 摘 要 短视频平台是以特定群众为目标的差异化群体定位工具。其利用自身的便捷性可以实现视频的随时拍摄和随时上传,可以产生亚文化圈的萌芽。这种开放便利的特性在吸引了广大用户的同时,也在一定程度上解决了由…

C#面试题 2

七、AOP如何在代码层面实现? ①静态代理实现AOP,自己写代理对象; ②动态代理实现AOP,运行时动态生成一个代理对象。 静态代理的实现:①装饰器模式(允许向一个现有的对象添加新的功能,同时又不…

Doris----Rollup表分析及案例实现

ROLLUP 在多维分析中是“上卷”的意思,即将数据按某种指定的粒度进行进一步聚合。 之前的聚合模型: 用户id数据插入时间城市年龄性别最后一次访问的时间该用户的总消费额该用户的最大停留时长该用户的最小停留时长100002017/10/2北京1002017/10/02 08:00:00651521…

C++:STL--List

文章目录 一.STL-list的数据结构链表结点模板 二.List的框架与迭代器的实现1.STL中的容器迭代器2.List的迭代器List正向遍历迭代器类模板(对ListNode< T >* 指针的封装)反向遍历迭代器的类模板(对正向迭代器的封装) 3.List的实现框架 三. List的成员接口的实现1.在List类…

GPT-4发布!ChatGPT大升级!太太太太强了!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a…

C语言之数组指针2.0

在 C 语言中&#xff0c;数组指针是一种特殊的指针类型&#xff0c;它是一个指向数组的指针。其声明形式为&#xff1a; <数据类型> (*<指针变量名>)[<数组长度>];例如&#xff0c;下面声明了一个指向整型数组的指针变量 arrPtr&#xff1a; int (*arrPtr)…

数据等级划分

数据大致可以分为定性数据与定量数据&#xff0c;但细分可以分为四类&#xff1a;定类数据、定序数据、定距数据、定比数据 处理数据的流程&#xff1a; 参考&#xff1a; 特征工程入门与实践

如何使用ChatGPT提升自己的“码”力?

如何使用chatGPT提升自己的"码"力? 代码评审(CodeReview)代码优化代码释义提供解决方案代码生成设计模式和架构建议学习新知识总结 ChatGPT是什么&#xff0c;我就不用再多介绍了吧&#xff01;相信大家已经看到了它在文本领域所展现出来的实力&#xff0c;虽然目前…

PAT A1152 Google Recruitment

1152 Google Recruitment 分数 20 作者 陈越 单位 浙江大学 In July 2004, Google posted on a giant billboard along Highway 101 in Silicon Valley (shown in the picture below) for recruitment. The content is super-simple, a URL consisting of the first 10-dig…

2023商家外卖数据

商家列表 外卖商品销量 shop_channel varchar(20) DEFAULT NULL, shop_system varchar(20) DEFAULT NULL, shop_system_no varchar(50) DEFAULT NULL, shop_platform varchar(20) DEFAULT NULL, shop_id varchar(50) NOT NULL, shop_id_str varchar(50) NO…

ChatGPT自动生成思维导图

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT自动生成思维导图 文章目录 &#x1f350;问题引入&#x1f350;具体操作markmapXmind &#x1f433;结语 &#x1f…

【Web】JWT(JSON Web Token)验证是什么?和SWT,SMAL的区别

JWT是什么&#xff1f; JWT&#xff08;JSON Web Token&#xff09;是一种轻量级的安全传输方式&#xff0c;可以用于在不同的系统之间传递安全可靠的信息&#xff0c;例如用户身份验证、授权和信息交换等。JWT采用JSON格式对信息进行编码和传输&#xff0c;用于在各方之间以 …