Web架构101

当我开始成为一名web开发者时,就希望理解基本的架构思想。
在这里插入图片描述

上面的架构图是比较好地描述Storyblocks架构。如果你不是一个有经验的web开发者,你将发现它是复杂的。在深入研究每个组件的细节之前,下面的介绍应该会让您更容易理解它。

用户在google搜索“Strong Beautiful Fog And Sunbeams In The Forest”。第一个结果是来自我们领先的照片和矢量量网站Storyblocks。用户单击图片将浏览器重定向到图像详细信息页面。在底层,用户浏览器向DNS服务器发送请求,以查找如何连接到Storyblocks,然后发送请求出去。

请求到达负载均衡器后会随机选择10个左右的web服务器中的一个来处理请求。web服务从我们的缓存服务搜索图片的一些信息,并且从数据库中获取其他数据。我们注意到图片的颜色配置文件尚未计算生成,因此我们向作业队列发送一个颜色配置文件作业,作业服务器将异步处理该作业,并把结果更新到数据库。

接下来,我们将使用照片的标题作为输入,向全文搜索服务发送一个请求,尝试找到类似的照片。用户刚好以会员身份登录到Storyblocks中,所以我们会从帐户服务中查找他的帐户信息。最后,我们将一个页面视图事件发送给我们的数据管道,这些数据管道将被记录在我们的云存储系统上,并最终加载到我们的数据仓库中,分析人员使用数据仓库来帮助回答有关业务的问题。

服务器首先通过负载均衡器将页面视图呈现为HTML并将其发送到用户浏览器中。该页面包含Javascript和CSS,被加载到连接我们CDN的云存储系统中,用户浏览器通过与CDN连接来搜索内容。

接下来,我将介绍“101”中的每个组件,这些介绍将为您提供一个很好的模型,帮助您思考未来的web体系架构。接下来,我将根据我在Storyblocks中学到的知识,撰写另一系列文章,提供具体的实现建议。

1.DNS

DNS为“域名系统”,它是使万维网成为可能的关键技术。在最基本的层次上,DNS提供从域名(例如google.com)到IP地址(例如85.129.83.120)的键值查找,这是计算机将请求路由到适当服务器所必需的。就像电话号码一样,域名和IP地址之间的区别就像打电话给John Doe和打电话给201-867 5309之间的区别一样。就像以前你需要一本电话簿来查找John的电话号码一样,你也需要DNS来查找域名的IP地址。你可以把DNS看成是互联网的电话簿。

还有很多细节我们可以在这里讲,但我们会跳过它,因为它对我们的101-level介绍不是很重要。

2.Load Balancer

在深入研究负载均衡的细节之前,我们需要回过头来讨论水平和垂直应用程序扩展。它们是什么且有什么不同?很简单这个问题在StackOverflow 中有问过,水平扩展意味着通过向资源池中添加更多的机器来扩展,而垂直扩展则意味着通过向现有机器添加更多的能力(例如CPU、RAM)来扩展。

在web开发中,您(几乎)总是希望水平扩展,因为为了保持简单,高可用。服务器随机性宕机,网络降级,整个数据中心偶尔也会离线。拥有多个服务器允许某台出现宕机后,您的应用程序可以继续运行。换句话说,您的应用可以“容错”。第二,通过让后端应用程序(web服务器、数据库、服务X等)的每个部分运行在不同的服务器上,水平扩展允许您将它们最少地耦合在一起。最后,可能会达到一定规模后无法再进行垂直扩展。世界上没有足够大的计算机可以完成所有应用程序的计算。把google搜索平台作为一个典型的例子,尽管这适用于规模小得多的公司。例如,Storyblocks在任何给定的时间点运行150到400个AWS EC2实例。它通过垂直扩展来提供整个计算能力将是一个挑战。

好的,回到负载均衡服务器。他们使水平扩展成为可能,是不可思议的。它们将传入的请求路由到应用服务器集群中的一个,这些服务器通常是彼此的克隆镜像,并将响应从应用服务器发回客户端。它们中的任何一个都应该以相同的方式处理请求,所以只需要将请求分布到一组服务器上,这样它们就不会过载。

3. Web Application Servers

在高级的web应用程序服务器中,描述说明相对简单。
它们执行核心业务逻辑并处理用户请求,将HTML发送到用户浏览器。为了实现功能,它们通常与各种后端基础设施通信,比如数据库、缓存层、作业队列、搜索服务、其他微服务、数据记录队列等等。如上所述,为了处理用户请求,您通常至少有两个甚至更多的负载均衡器。

您应该知道,应用程序服务器实现需要选择特定的语言(Node.js、Ruby、PHP、Scala、Java、c# .net等)和该语言的web MVC框架(Node.js, Ruby on Rails, Play for Scala, Laravel for PHP等)。但是,深入研究这些语言和框架的细节超出了本文的范围。

4.Database Servers

每个现代web应用程序都通过一个或多个数据库来存储信息。数据库提供了定义数据结构、插入新数据、查找现有数据、更新或删除现有数据、跨数据执行计算等方法。在大多数情况下,web应用程序服务器都直接与一和作业服务器应用程序交互。此外,每个后端服务可能有自己的数据库,这些数据库与其他应用程序隔离。

虽然我避免对每个体系结构组件的特定技术进行深入研究,更不用说数据库的下一个层次的细节:SQL和NoSQL,这对您是一种伤害。

SQL是结构化查询语言的缩写,创建于20世纪70年代,它提供了一种被广泛用户访问查询关系数据集的标准方法。SQL数据库将数据存储在通过主键id(一般是整型)关联在一起的数据表中。让我们看一个为用户存储历史地址信息的简单示例。您可能有两张表,用户和用户地址,通过用户id关联在一起。请参阅下面的图以获得一个简单的版本。这些表是有关联的,因为用户地址中的用户id列是用户表中id列的外键。
在这里插入图片描述

如果您不太了解SQL,我强烈建议您浏览一下Khan Academy上的教程。它在web开发中无处不在,因此您至少需要了解一些基本知识,以便正确地构建应用程序。

NoSQL(非sql的缩写)是一个更新的数据库技术,它用于处理大型web应用程序所生成的大量数据(大多数SQL变体不能很好地水平扩展,只能垂直扩展到某个点)。如果您对NoSQL一无所知,我建议您从以下高级介绍开始:

我还想记住,总的来说,业界正在将SQL甚至是NoSQL数据库作为一个接口,所以如果您不了解SQL,那么您确实应该学习它.现在几乎没有办法避免它。

5.Caching Service

缓存服务提供了一个简单的key/value数据存储,使得在接近O(1)的时间内保存和查找信息成为可能。应用程序通常利用缓存服务来保存昂贵计算的结果,以便能够从缓存中检索结果,而不是在下次需要时重新计算它们。应用程序可能缓存来自数据库查询、对外部服务的调用、给定URL的HTML等的结果。下面是一些来自实际应用程序的示例:

  • Google缓存普通搜索查询如"dog"或"TaylorSwift"的搜索结果,而不是每次都重新计算它们

  • Facebook会缓存你登录时看到的大部分数据,比如帖子数据、好友等。点击这里阅读关于Facebook缓存技术的详细文章。

  • Storyblocks缓存来自服务器端React渲染的HTML,搜索、预输入结果等。

两种最广泛的缓存服务器技术是Redis和Memcache。我将在另一篇文章中详细介绍。

6.Job Queue & Servers

大多数web应用程序需要在与响应用户请求没有直接关联的后台异步地执行一些工作。例如,为了返回搜索结果,Google需要爬行和索引整个internet。它不会每次搜索时都这样做。相反,它异步地从web爬虫,同时更新搜索索引。

虽然有不同的体系架构可以完成异步工作,但最普遍的是我将称为作业队列体系架构。它由两个组件组成:需要运行的作业队列和运行作业队列中一个或多个作业服务器(通常称为worker)。

作业队列存储需要异步运行的作业列表。最简单的是先进先出(FIFO)队列,尽管大多数应用程序最终需要某种优先级排队系统。每当应用程序需要运行某个作业时,无论是按照某种常规计划运行,还是根据用户操作决定运行,它都会将适当的作业添加到队列中。

例如,Stockblocks利用作业队列来支持许多支持营销所需的后台工作。我们运行作业来编码视频和照片,处理用于元数据标记的CSV文件,聚合用户统计信息,发送密码重置电子邮件,等等。我们从一个简单的FIFO队列开始,我们升级到一个优先队列,以确保像发送密码重置电子邮件这样的时间敏感操作能够尽快完成。

作业服务器处理作业。它们轮询作业队列以确定是否有工作要做,如果有,则从队列中取出一个作业并执行它。底层语言和框架的选择与web服务器一样多,因此本文不深入讨论细节。

7.Full-text Search Service

许多web应用程序都支持某种搜索功能,其中用户提供文本输入(通常称为查询),应用程序返回最相关的结果。支持此功能的技术通常称为“全文搜索”,它利用反向索引快速查找包含查询关键字的文档。

在这里插入图片描述

示例显示如何将三个文档标题转换为反向索引,以便从特定关键字快速查找标题中包含该关键字的文档。注意,常见的单词,如in、the、with等(称为stop words),通常不包括在反向索引中

虽然可以直接从某些数据库进行全文搜索(例如,MySQL支持全文搜索),但通常运行一个单独的搜索服务来计算和存储反向索引并提供查询接口。目前最流行的全文搜索平台是Elasticsearch,不过也有其他选项,比如SphinxApache Solr.

8.Services

一旦应用程序达到一定规模,很可能就会有某些服务被分割出来作为单独的应用程序运行.它们不暴露于外部世界,而是应用程序和其他服务与它们交互.Storyblocks,例如,拥有多个可操作和计划的服务:

  • 账户服务存储我们所有网站的用户数据, 这使我们能够轻松地提供交叉销售机会, 并创建更统一的用户体验.

  • 内容服务存储所有视频、音频和图像内容的元数据。它还提供了下载内容和查看下载历史的接口.

  • 支付服务提供了一个为客户信用卡付款的接口。

  • HTML PDF服务提供了一个简单的接口,它接受HTML并返回相应的PDF文档。

9.Data

今天,企业的生死存亡取决于它们如何利用数据。如今几乎所有应用程序,一旦达到一定规模,都会利用数据管道来确保数据可以被收集、存储和分析。一个典型的管道有三个主要阶段:

  1. 该应用程序将数据(通常是关于用户交互的)发送到data “firehose”, 它提供一个流接口来摄取和处理数据。通常情况下, 原始数据被转换或增强并传递到另一个firehose。AWS Kinesis和Kafka是两种最常用的技术。
  2. 原始数据和转换或增强数据都保存到云存储中。AWS Kinesis提供了一个名为firehose的配置功能,使得原始数据保存到它的云存储(S3)非常容易配置。
  3. 转换或增强数据通常被加载到数据仓库中进行分析。我们和大多数成长的初创企业一样使用AWS Redshift,尽管大公司通常会使用Oracle或其他专有的仓库技术。如果数据集足够大,可能需要使用类似hadoop的NoSQL MapReduce技术进行分析。

在架构图中另一个步骤没有画出:将应用和服务的操作数据库中的数据加载到数据仓库中。例如,在Storyblocks中,我们每天晚上都将我们的VideoBlocks、AudioBlocks、storyblock、account service和contributor portal数据库加载到Redshift中。通过将核心业务数据与用户交互事件数据放在一起,这为我们的分析师提供了一个完整的数据集。

10.Cloud storage

根据AWS的说法,“云存储是在Internet上存储、访问和共享数据的一种简单且可扩展的方式”。您可以使用它来存储和访问您在本地文件系统上存储的任何或多或少有价值的内容,并且能够通过HTTP的RESTful API与之交互。Amazon’s S3是目前最流行的云存储,也是我们在storyblock中广泛依赖的存储视频、照片和音频资源、CSS和Javascript、用户事件数据等的云存储.

11.CDN

CDN代表“内容分发网络”,该技术提供了一种在web上为静态HTML、CSS、Javascript和图像等资源提供服务的方法,比从单一源服务器提供这些服务快得多。它的工作原理是将内容分布在世界各地的许多边缘服务器上,这样用户最终就可以从边缘服务器而不是原始服务器下载资源。例如,在下面的图中,西班牙的用户从一个站点请求一个web页面,该站点的源服务器位于纽约市,但是页面的静态资产是从英国的CDN edge服务器加载的,这防止了许多跨大西洋的HTTP请求变慢。

在这里插入图片描述
查看本文以获得更全面的介绍。一般来说,web应用程序应该始终使用CDN来提供CSS、Javascript、图像、视频和任何其他资源。一些应用程序还可以利用CDN来提供静态HTML页面。

最后祝愿

以上就是Web体系结构-101的全部内容。我希望这对你有用。我希望在接下来的一两年里,能够发布一序列201文章,深入探讨其中的一些组件。

Ps:英文原文,翻译如有疏漏,敬请指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值