Web架构101·简单解释

当你作为一名Web开发者开始时,我希望你了解基本的架构概念。

web 101.png

上面的图表相当清楚地展示了Storyblocks的架构。对于经验不丰富的网页开发者来说,可能会变得复杂。以下简要说明每个组件。

1. 域名系统

DNS是“域名系统”的简称,是实现互联网的基础技术。在最基本的层面上,DNS提供了从域名(例如google.com)到IP地址(例如85.129.83.120)的键值对搜索功能。这对于计算机将请求路由到正确的位置是必要的。就像电话号码一样,域名和IP地址的区别在于“给JohnDoe打电话”和“给201-867-5309打电话”的区别。就像需要电话簿来查找John的号码一样,DNS也是为了查找域名的IP地址而需要的。因此,我们可以将DNS视为互联网的电话簿。

在这里可以详细解释,但内容超出了本文的范围。

2. 负载均衡器(Load Balancer)

在深入介紹負荷分散之前,有必要先解釋水平方向和垂直方向的應用程式擴展。它們分別是什麼,有什麼區別呢?簡單說明一下在StackOverflow帖子中,水平擴展是指向資源池中添加機器以進行擴展,而垂直擴展則是指向現有機器添加電源(例如CPU、RAM等)以進行擴展。

在Web开发中,为了保持稳定性,通常需要以水平方向进行扩展。当服务器崩溃、网络信号不稳定或整个数据中心离线时,具有多个服务器的应用程序能够继续运行,因此具备了“容错性”。其次,通过使用水平扩展,可以将应用程序后端的各个组件(如Web服务器、数据库、X服务等)分别在不同的服务器上运行,从而将它们最小化地耦合在一起。最后,可能会达到无法再纵向扩展的规模。没有足够大的计算机能够执行应用程序的所有计算。虽然这更适用于规模较小的企业,但请考虑谷歌搜索平台作为典型例子。

现在让我们回到负载均衡器。这些是能够实现水平扩展的神奇资源。它们通常将传入请求路由到许多应用服务器之一,这些服务器通常是对方的克隆/镜像,并将来自应用服务器的响应发送回客户端。通过将请求分散到整个服务器集合中,只需确保这些服务器中的任何一个以相同的方式处理请求,就可以避免过载。

从概念上来说,负载均衡器相当简单。尽管确实存在一些复杂的问题,但我们并不需要深入到101版本中。

3. 网络应用服务器

在高级水平上,编写Web应用程序服务器相对简单。这些服务器处理用户请求并执行核心业务逻辑,将HTML发送回用户的浏览器。Web服务器通常与各种后端基础设施进行通信,例如数据库、缓存层、作业队列、搜索服务、其他微服务、数据/日志队列等。如上所述,为了处理用户请求,负载均衡器通常至少连接两台服务器,通常更多。

在实现应用服务器时,需要知道选择特定的语言(如Node.js、Ruby、PHP、Scala、Java、C#.NET等)以及该语言的Web MVC框架(如Express for Node.js、Ruby on Rails、Play for Scala、Laravel for PHP等)是必要的。然而,本文的范围不包括这些语言和框架的详细信息。

4. 数据库服务器

最新的Web应用程序使用一个或多个数据库来存储信息。数据库提供定义数据结构、插入新数据、查找现有数据、更新或删除现有数据、执行整个数据计算等方法。在大多数情况下,Web应用服务器与一个作业服务器直接通信。此外,每个后端服务可能有自己独立的数据库,与应用程序的其他部分分离。

避免深入探討各个架构组件的特定技术,只提到数据库的下一个层次:SQL和NoSQL。

SQL是Structured Query Language的缩写,它在1970年代被发明,并提供了一种标准的方法,可以查询广泛用户可以访问的关系数据集。SQL数据库通过存储在通过共同的ID(通常是整数)链接的表中的数据来实现。让我们看一个简单的例子,来保存用户过去的地址信息。有两个表,用户和用户地址,它们可能通过用户的ID进行链接。请参考下面的图像,关于简单版本。用户地址表中的user_id列是作为指向users表id列的“外键”,因此这两个表是链接的。

db.png

如果对SQL不太熟悉的话,强烈建议你执行像Khan Academy这样的教程。由于在Web开发中广泛使用,为了正确设计应用程序,你需要至少了解基础知识。

「Non-SQL」或称NoSQL是一组新的数据库技术,用于处理可能在大型Web应用程序中生成的大量数据(大多数SQL变体无法水平扩展到足够的程度,只能在垂直方向上扩展到特定点)。如果对NoSQL一无所知,建议从以下高级介绍开始,以便更好地理解NoSQL的七个步骤。

另外,要注意的是,通常行业中使用SQL作为NoSQL数据库的接口,因此如果不了解SQL的话,就需要学习SQL。最近几乎没有绕过这个问题的方法。

5. 现金贷款服务

现金服务提供了一个简单的键/值数据存储,可以在接近O(1)小时的时间内检索信息。应用程序通常会使用缓存服务来保存耗费大量计算的结果。这样,下次需要时,可以从缓存中获取结果,而不是重新计算。应用程序可能会缓存数据库查询、对外部服务的调用、特定URL的HTML等结果。以下是实际应用的例子:

    • Googleは、「犬」や「テイラースウィフト」などの一般的な検索クエリの検索結果を、毎回再計算するのではなくキャッシュします。

 

    • Facebookは、投稿データや友達など、ログイン時に表示されるデータの多くをキャッシュします。Facebookのキャッシュ技術に関する詳細な記事はこちらをご覧ください。

 

    Scaling memcache at Facebook

6. 工作队列和服务器

大多数的Web应用程序需要在与用户请求无直接关联的后台中异步执行一些操作。例如,Google需要遍历整个互联网并创建索引以返回搜索结果。它不是每次搜索都这样做,而是异步地进行网络爬虫并在过程中更新搜索索引。

在可能实现异步作业的不同架构中,最常见的是我所称之为”作业队列”架构的方式。该架构组成了两个组件:需要执行的”作业”队列和执行队列中的一个或多个作业服务器(称为”工作者”)。

作业队列将存储需要以异步方式执行的作业列表。最简单的方法是先进先出(FIFO)队列,但大多数应用程序都需要某种优先级队列系统。应用程序只需在某种定期计划或由用户操作决定时,添加适当的作业到队列中,以便在需要执行作业时执行。

作业服务器负责处理作业。它会扫描作业队列,判断是否有要执行的作业,如果有,则从队列中取出并执行。

全文搜索服務

许多网络应用程序支持用户输入文本并返回与之最相关的结果的搜索功能。这种增强功能的技术通常被称为“全文搜索”,它利用倒排索引快速搜索包含查询关键词的文档。

full text search.png

为了方便从特定关键字到包含该关键字在内的文件标题的快速搜索,以下是示例说明将三个文件标题转换为倒排索引的方法。请注意,常见词语(也称为停用词),如”in”、”the”、”with”等通常不包含在倒排索引中。

在一部分数据库中直接执行全文搜索是可能的(例如,MySQL支持全文搜索),但通常情况下,人们会计算和存储倒排索引,并提供一个查询接口来执行另一个”搜索服务”。还有其他选择,如Sphinx和Apache Solr,但目前最流行的全文搜索平台是Elasticsearch。

8. 服务

当应用达到特定规模时,可能存在特定的“服务”被划分出来作为单独的应用程序来运行。这些服务虽然不对外公开,但它们与应用程序和其他服务进行相互作用。例如,应用程序A可能包含一些运营服务和计划服务。

    • アカウントサービスは、すべてのサイトのユーザーデータを保存します。これにより、クロスセルの機会を簡単に提供し、より統一されたユーザーエクスペリエンスを作成できます。

 

    • コンテンツサービスは、すべてのビデオ、オーディオ、および画像コンテンツのメタデータを保存します。また、コンテンツをダウンロードしてダウンロード履歴を表示するためのインターフェイスも提供します。

 

    • 決済サービスは、顧客のクレジットカードに請求するためのインターフェースを提供します。

 

    HTML→PDFサービスは、HTMLを受け入れ、対応するPDFドキュメントを返すシンプルなインターフェイスを提供します。

9. 数据。

今天,企业的生死取决于他们如何有效地利用数据。近年来,几乎所有的应用程序在达到一定规模后都会利用数据管道来收集、存储和分析数据。一般的数据管道包含以下三个主要阶段。

    1. 应用程序将数据(通常是与用户操作相关的事件)发送到数据“firehose”。数据“firehose”提供了用于捕获并处理数据的流式接口。通常情况下,原始数据会经过转换或扩展,并传递到另一个“消防水带”中。 AWS Kinesis和Kafka是实现此目的的两种最常见的技术。

 

    1. 原始数据和最终转换/扩展的数据存储在云存储中。 AWS Kinesis提供了名为“firehose”的配置,可以非常简单地将原始数据保存到云存储(S3)中。

 

    转换/扩展的数据通常会加载到数据仓库进行分析。就像大多数初创公司所做的那样,他们使用AWS Redshift,而大企业则经常使用Oracle或其他专有的仓库技术。当数据集很大时,分析可能需要使用像Hadoop这样的NoSQL MapReduce技术。

在架构图中没有显示的另一步是从应用和服务的运营数据库将数据加载到数据仓库中。

10. 云存储

根据AWS的说法,云存储是一种简单且可伸缩的方法,可以通过互联网保存、访问和共享数据。使用云存储,可以保存并访问存储在本地文件系统中的文件,并且可以通过基于HTTP的RESTful API进行交互。

11. CDN:内容分发网络

CDN是“内容传递网络”(Content Delivery Network)的缩写,这项技术通过将静态HTML、CSS、Javascript、图像等资源以比从单个源服务器提供更快的方式通过Web进行提供。它通过将内容分发到全球各地的许多“边缘”服务器来实现,使用户可以从“边缘”服务器而不是源服务器下载资源。例如,在下面的图像中,西班牙用户从拥有纽约源服务器的网站请求网页,但是页面的静态资源是从英国的CDN“边缘”服务器加载的,因此不会产生许多横跨大西洋的低速HTTP请求。

cdn.png

请查看本文以获得更完整的介绍。通常情况下,网络应用程序需要始终使用CDN来提供CSS、Javascript、图像、视频和其他资产。有些应用程序也可以利用CDN来提供静态HTML页面。

这是Web架构的总结。如果这对你有帮助的话,我会非常高兴。希望未来能够发布一系列深入探讨这些组件的文章。

请问您需要哪方面的参考材料?

Storyblocks 网络架构入门101

广告
将在 10 秒后关闭
bannerAds