大型动态应用系统平台主要是针对于大流量、高并发网站建立的底层系统架构。大型网站的运行需要一个可靠、安全、可扩展、易维护的应用系统平台做为支撑,以保证网站应用的平稳运行。
下图是现代Web应用架构的一个很好的概览。如果不是经验丰富的Web开发人员,可能会觉得它很复杂。通过以下的介绍可以对每个组件的细节有一个初步的认识和了解。
图1 web应用架构概览
1. DNS
DNS代表“域名服务器”,它是使万维网成为可能的骨干技术。DNS提供从域名(例如,google.com)到IP地址(例如,85.129.83.120)的键/值查找,这是计算机将请求路由到适当的所必需的。类似于电话号码,域名和IP地址之间的差异是“致电John Doe”和“致电201-867-5309”之间的区别。就像需要一本电话簿来查找过去John的号码,需要DNS来查找域的IP地址。因此,可以将DNS视为互联网的电话簿。
2. 负载均衡
在深入研究负载平衡的细节之前,需要退一步讨论水平与垂直应用程序扩展。水平扩展意味着可以通过在资源池中添加更多计算机来扩展,而“垂直”扩展意味着可以通过向现有计算机添加更多功率(例如,CPU,RAM)来扩展。
在Web开发中,总是希望水平扩展,为了简单起见,也是因为内容可能会中断。服务运行的过程中会出现服务器随机崩溃、网络降级、整个数据中心脱机等问题。拥有多个服务器允许规划中断,以便应用程序继续运行。换句话说,应用程序是“容错的”。其次,横向扩展允许通过让每个部分在不同的服务器上运行来最小化地耦合应用程序后端的不同部分(Web服务器,数据库,服务X等)。
回到负载平衡器,它们使水平缩放成为可能。它们将传入的请求路由到许多应用程序服务器中的一个,这些服务器通常是彼此的克隆/镜像映像,并将响应从应用程序服务器发送回客户端。它们中的任何一个都应该以相同的方式处理请求,因此只需要在服务器集中分发请求,这样就不会使这些请求过载。
3. Web应用服务器
Web应用程序服务器的描述相对简单。它们执行处理用户请求的核心业务逻辑,并将HTML发送回用户的浏览器。为了完成其工作,它们通常与各种后端基础设施进行通信,例如数据库,缓存层,作业队列,搜索服务,其他微服务,数据/日志记录队列等。 如上所述,为了处理用户请求,通常需要多个应用服务器,并且需要插入负载均衡服务。
应用服务器的实现需要选择特定语言(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应用程序服务器与作业服务器直接对话。此外,每个后端服务可能拥有自己的数据库,该数据库与应用程序的其余部分隔离。
NoSQL代表“Non-SQL”,它是一种新的数据库技术集,它可以处理大规模Web应用程序可以生成的大量数据(SQL的大多数变体都不能很好地水平扩展,只能垂直缩放到某一点)。大体上,业界正在将SQL作为一个接口,即使对于NoSQL数据库也是如此。学习SQL是必不可少的,几乎所有的Web应用都会使用它。
5. 缓存服务
缓存服务提供了一个简单的键/值数据存储,可以在接近O(1)的时间内保存和查找信息。 应用程序通常利用缓存服务来保存昂贵计算的结果,以便可以从缓存中检索结果,而不是在下次需要时重新计算它们。应用程序可能会缓存数据库查询,对外部服务的调用,给定URL的HTML等等的结果。 以下是来自实际应用的一些示例:
- Google会为常见搜索查询(如“dog”或“Taylor Swift”)缓存搜索结果,而不是每次都重新计算它们
- Facebook会缓存您在登录时看到的大部分数据,例如发布数据,朋友等。在此处阅读有关Facebook缓存技术的详细文章。
目前两种最普遍的缓存服务器技术是Redis和Memcache。
6. 任务队列&服务器
大多数Web应用程序需要在幕后异步执行一些与响应用户请求无直接关联的工作。例如,Google需要抓取并索引整个互联网才能返回搜索结果。但是它不是每次搜索时都会这样做。相反,它异步爬取信息,在整个过程中更新搜索索引。
虽然有不同的体系结构可以完成异步工作,但最普遍的就是我称之为“作业队列”的体系结构。它由两部分组成:需要运行的“作业”队列和运行队列中作业的一个或多个作业服务器(通常称为“工作者”)。
作业队列存储需要异步运行的作业列表。最简单的是先进先出(FIFO)队列,但大多数应用程序最终需要某种优先级排队系统。每当应用程序需要运行作业时,无论是在某种常规计划中还是由用户操作确定,它只需将相应的作业添加到队列中。
例如,相关公司可以利用一个工作队列提供后台支持。运行工作来编码视频和照片,处理CSV以进行元数据标记,聚合用户统计信息,发送密码重置电子邮件等。工作队列可以采用优先级队列算法,以确保尽快完成发送密码重置电子邮件等时间敏感操作。
作业服务器处理作业。它们轮询作业队列以确定是否有工作要做,如果有,它们会从队列中弹出作业并执行它。
7. 全文搜索服务
许多Web应用程序支持某种搜索功能,其中用户提供文本输入(通常称为“查询”),并且应用程序返回最相关的结果。支持此功能的技术通常称为“全文搜索”,它利用反向索引快速查找包含查询关键字的文档。
图2 反向索引示例
虽然可以直接从某些数据库进行全文搜索(例如,MySQL支持全文搜索),但通常运行单独的“搜索服务”来计算和存储反向索引并提供查询接口。今天最流行的全文搜索平台是Elasticsearch,尽管还有其他选项,如Sphinx或Apache Solr。
8. 通用服务
一旦应用程序达到一定规模,可能会有某些“服务”被分割出来作为单独的应用程序运行。它们没有暴露于外部世界,但应用程序和其他服务与它们互动:
- 帐户服务:在网站上存储用户数据,这使得商家能够轻松提供交叉销售机会并创建更统一的用户体验
- 内容服务存储所有视频,音频和图像内容的元数据。它还提供用于下载内容和查看下载历史记录的界面。
- 支付服务提供用于对客户信用卡进行计费的界面。
- HTML→PDF服务提供了一个接受HTML并返回相应PDF文档的简单界面。
9. 数据
如今,公司存亡取决于他们利用数据的能力。几乎每个应用程序,一旦达到一定规模,就会利用数据管道来确保收集,存储和分析数据。典型的管道有三个主要阶段:
- 该应用程序将数据(通常是关于用户交互的事件)发送到数据“firehose”,该数据提供用于摄取和处理数据的流接口。通常,原始数据被转换或扩充并传递给另一个firehose。 AWS Kinesis和Kafka是用于此目的的两种最常用的技术。
- 原始数据以及最终转换/增强数据保存到云存储。AWS Kinesis提供了一个名为“firehose”的设置,可以将原始数据保存到云存储(S3)中,非常容易配置。
- 经过转换/增强的数据通常被加载到数据仓库中进行分析。大型公司通常会使用Oracle或其他专有存储技术。如果数据集足够大,则可能需要类似Hadoop的NoSQL MapReduce技术进行分析。
架构图中没有描绘的另一个步骤:将数据从应用程序和服务的操作数据库加载到专门存储数据的数据库中。通过将核心业务数据与用户交互事件数据结合起来,为分析师提供一个整体数据集。
10. 云存储
据AWS称,“云存储是一种通过互联网存储,访问和共享数据的简单且可扩展的方式”。 您可以使用它来存储和访问或多或少存储在本地文件系统上的任何内容,并且可以通过HTTP上的RESTful API与其进行交互。亚马逊的S3产品是目前最流行的云端存储产品,也是许多多媒体行业公司广泛依赖的产品,用于存储视频,照片和音频资产,CSS和Javascript,用户事件数据等等。
11. CDN
CDN代表“内容分发网络”,该技术提供了一种通过网络提供静态HTML,CSS,Javascript和图片等内容的方式,比从单一源服务器提供服务要快得多。它的工作原理是在世界各地的许多“边缘”服务器上分发内容,以便用户最终从“边缘”服务器而不是源服务器下载内容。例如,在下图中,西班牙的用户从位于纽约市的原始服务器的站点请求网页,但该页面的静态资产是从英格兰的CDN“边缘”服务器加载的,从而防止了许多缓慢的跨大西洋HTTP 要求。
图3 CDN示例
通常,Web应用程序应始终使用CDN来提供CSS,Javascript,图像,视频和其他媒体内容。某些app也可能利用CDN来提供静态HTML页面。
参考资料
[1]https://engineering.videoblocks.com/web-architecture-101-a3224e126947
[2]https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013