980992980
0743-53061788
导航

你真的相识反映式Web编程吗?

发布日期:2022-10-27 00:08

本文摘要:在已往的几年间,Web应用在日常生活中开始饰演越来越重要的角色。如社交网络这样的大型应用、电子商务网站这样的中型应用,以及针对小型业务的在线账户系统或项目治理工具这样的更小型的应用,人们对这些服务的依赖与日俱增。现在,这种趋势已经转移到了物理设备上,信息技术咨询和研究公司Gartner预测,到2020年,物联网的装机量将会到达260亿台。 这种快速演化带来了高可用性和资源使用率方面的需求,而反映式Web应用正是这些问题的解决方案。

2022世界杯登录官网

在已往的几年间,Web应用在日常生活中开始饰演越来越重要的角色。如社交网络这样的大型应用、电子商务网站这样的中型应用,以及针对小型业务的在线账户系统或项目治理工具这样的更小型的应用,人们对这些服务的依赖与日俱增。现在,这种趋势已经转移到了物理设备上,信息技术咨询和研究公司Gartner预测,到2020年,物联网的装机量将会到达260亿台。

这种快速演化带来了高可用性和资源使用率方面的需求,而反映式Web应用正是这些问题的解决方案。以往的Web应用开发需要在一个应用中试图解决所有的问题,而云盘算以及随之而来的云服务的生长,使这个历程已经演化为识别和毗连适当的云服务,然后开发者将精神放到那些之前没有完美解决的问题上即可。一个新的工具集,可以有效地处置惩罚这种演化所带来的挑战。Play框架的设计本意就是让构建反映式Web应用成为可能,即即是在高负载和去中心化的设置下,这些应用也能为用户提供实时的交互行为。

在Java虚拟机上,Play是在编写本书时唯一可用的全栈反映式Web应用框架。它在一些大公司中获得了应用,例如Morgan Stanley、Linkedin和The Guardian,另有许多较小的到场者,Play是一个免费开源的软件,可以随时下载到盘算机中。

在本文中,我们将相识什么是反映式Web应用、为什么要构建这种类型的应用,以及为什么说Play是实现这一目的的理想工具。我们首先解释清楚“反映式”这个词到底是什么寄义,其次先容硬件设计和软件架构方面的新趋势如何要求我们重新认识使用盘算资源的方法,最后,设想在这种场景下,故障处置惩罚为何如此至关重要以及如何实现这一功效。反映式的配景如果你正在阅读本书,那么很可能已经听说过反映式应用、反映式编程、反映式流或者反映式宣言这样的观点。这些术语加上“反映式”这一前缀可能会更令人兴奋,不外你可能更想知道在差别的上下文中,反映式到底意味着什么。

让我们从这个术语的起源及其与盘算机系统的关联关系谈起。1.1.1 反映式的起源反映式系统并不是新的观点。在David Harel和Amir Pnueli的论文“反映式系统的开发”(1985 年揭晓)中,他们接纳二分法的方式对庞大盘算机系统的特征举行了归纳,提出了一种新颖的二分方式:转换式与反映式系统。

转换式系统吸收已知的一组输入,转换这些输入并发生输出。例如,一个转换式的系统可能会提示用户举行一些输入,视用户的输入可能还会要求输入更多的内容,最后为用户提供一个效果。举例来说,一个便携式的盘算器会吸收数字,并举行一些基本的操作,最后当等号键按下时为用户生成一个效果。

而反映式系统是连续受到外部情况刺激的,它们的角色就是连续响应刺激。例如,启用Wi-Fi且支持运动探测的相时机监测到小偷突入了房间,而且发送报警到相机主人的手机上,这样他们就能在眼见自己的珍贵物品被洗劫一空之前,通过报警让警员实时赶到,制止小偷的行为。

几年之后,Gérard Berry对这个界说举行了完善,他论述了交互式法式和反映式法式的差异。交互式法式能够设置它们自身与情况交互的速度,而反映式法式能够凭据情况的状况确定与情况交互的速度。

因此,反映式法式具有以下特点:能够连续地与情况举行交互;运行速度由情况决议而不是法式自己;响应外部的下令。反映式法式前面的做法看起来很像Web应用的操作方式,或者说很像Web应用应有的操作方式。

只管这在理论上很有吸引力,可是仍需要花费很大的努力才气满足这些条件。凭据用户的数量以及用户需求的特点,很可能另有严格的硬件资源要求。直到最近,我们才较多地听到“反映式系统”这个术语,这可能是因为一直以来都缺乏可广泛使用的高性能硬件,借助这样的硬件才气交付可扩展的实时交互系统。而现在,形貌反映式系统特征的一组焦点理念以“反映式宣言”的形式举行了公布。

1.1.2 反映式宣言第一版的反映式宣言是在2013年6月公布的,它形貌了名为反映式应用的一种软件架构。反映式应用是通过一组特征来界说的,这些特征在宣言中被称为trait(这些trait与Scala的trait毫无关系)。

具备这些特征的应用在行为上与我们在前面所讨论的反映式法式是相同的:连续可用而且能够毫无难题地响应外部下令。只管反映式宣言看起来像是形貌了一种全新的架构模式,可是它的焦点理念在一些行业中早就是众所周知的了——这些行业需要IT系统的实时行为,如金融生意业务。

反映式应用具有如下所示的四项特质:响应性:对用户的反映;扩展性:对负载的反映;弹性:对故障的反映;事件驱动:对事件的反映。响应性应用会在可用性和实时行为方面满足用户的期望。实时或靠近实时意味着应用需要在短时间或很是短的时间内发生响应。

请求和响应之间的时间距离称为延迟,在权衡系统的运行状况时,这是焦点的丈量点之一。为了能够连续地与情况举行交互,反映式应用必须能够适应它们所面临的负载状况。突然的流量暴增可能会对应用发生影响,例如,一条热门的带有新文章链接的tweet可能会给新闻站点带来流量的突然增加。

就这一点来讲,应用必须是可扩展的,且在须要的情况下,它必须能够使用增加的盘算能力。这意味着它必须能够高效使用单台机械(可能会有一个或多个CPU焦点)上的硬件,还要能够凭据负载的情况自由支配多个盘算节点完乐成能。

纵然是最简朴的软件系统,也有可能会发生故障(不管是软件相关的还是硬件相关的),反映式应用需要对故障保持弹性,以满足连续可用的需求。系统在酿成可扩展的系统之后,遇到问题能够自动恢复无疑就变得越发重要了。在漫衍式的情况下,这种情况之所以会越发庞大,是因为泛起硬件或网络故障的可能性会随之增加。

基于异步通信的事件驱动应用能够资助我们实现上述所列的反映式特征。在这种情况下,系统(或子系统)会对离散的事件做出反映,例如HTTP请求,在等候事件触发的历程中不会垄断盘算资源。这种固有的并发性使得它比传统的同步方法挪用在延迟方面体现得更好。

编写事件驱动法式的另一个利益就是组件是松耦合的,从恒久来看,软件越发具有可维护性。1.1.3 反映式编程反映式编程是一种基于数据流和变换流传的编程范式。

例如,表1.1所示的电子表格。表1.1 论述反映式编程理念的简朴电子表格单元格C1是以编程的方式来界说的,方式如下: = A1 * B1如果在电子表格软件中运行上述的样例,当A1或B1的值发生变化时,那么C1的效果也会相应改变。

电子表格隐含的编程语言允许我们界说数据之间的关联关系,这样就能实现跨表格的变换流传。为了实现实时的电子表格软件,如Google Drive上那样的表格,需要在更为低层级的观点上举行构建。

例如事件:当用户修改单元格A1的值,就会触发一个事件。所有对A1内容感兴趣的单元格,例如包罗表达式的C1,为了响应这个事件,都市重新盘算自身的值并将新的值显示出来。这个历程对用户是完全隐藏的,用户只需要形貌单元格之间高层级的关联关系即可。

在Web应用的开发历程中,这项技术被越来越多地用于前端应用的开发:例如KnockoutJS、AngularJS、Meteor和React.js这样的工具都使用了该范式。由于开发人员只需要形貌如何通过用户界面流传数据的变换,不需要体贴为特定DOM元素声明监听器的细节,因此能够极大地简化反映式用户界面的实现历程。在这种抽象方式中,事件饰演了焦点的角色,类似的抽象方式也泛起在服务端。

这里泛起了一种名为反映式流的新理念,我们将会在后续的章节讨论这个话题,它致力于为JVM上的异步流处置惩罚提供统一的接口。1.1.4 反映式技术的涌现近几年来,开发出的许多技术和框架在有些方面是共通的,可以从广义上归类为反映式技术。虽然构建反映式应用并不仅仅是使用反映式技术那么简朴,可是技术必须要满足一些先决条件,这样才气启用反映式行为,其中最重要的功效就是异步和事件驱动代码执行。

微软的Reactive Extensions能够用来组合异步和基于事件的法式,用于支持.NET平台和其他平台,如JavaScript。Node.js是一个盛行的平台,能够用JavaScript构建异步、事件驱动的应用。在JVM上,有一些库能够资助我们实现这些功效,如Apache MINA和Netty。这些低层级的技术都提供了构建异步和事件驱动应用的基本工具,可是要实现完整的Web应用,另有许多的事情要做。

我们需要处置惩罚代码组织、视图模板、静态资源的引入和组织(如样式表和JavaScript文件)、数据库毗连和宁静等问题。现在,已经有许多所谓的全栈Web应用框架,可是很少会同时包罗反映式技术,而从底层就使用反映式技术构建,以及在焦点包罗反映式理念的框架更是少之又少。全栈框架需要关注应用构建和部署历程中的所有分层:客户端UI技术(或者与其举行集成的方式)、服务端业务逻辑、认证、数据库会见集成以及用于通用任务(例如远程Web服务挪用)的种种库。

在反映式应用中,所有的这些分层都要根据相同的异步通信和错误恢回复则来协作。在JVM上,现在唯一成熟的全栈反映式Web应用框架就是Play。

其他诸如Lift等一些框架虽然在构建Web应用方面提供了一个很好的可选方案,但它们并没有将异步、故障恢复以及可扩展性作为主要的设计目的。Play构建在Netty之上,用反映式流所提供的异步流处置惩罚实现反映式行为(见图1.1)。图1.1 Play框架的整体架构Play解决了Web应用开发中典型的关注点,例如客户端资源处置惩罚、项目编译以及使用sbt构建工具举行打包。

2022世界杯登录官网在线入口

它自带了许多有用的库来处置惩罚通用的关注点,例如JSON处置惩罚和Web服务会见,还支持通过一系列插件来会见数据库。在本书中,我们将学习如何以Play框架作为有效的工具来构建反映式Web应用。我们现在近距离地看一下Web应用是如何运行的以及它们会如何使用盘算资源,从而明白反映式Web应用的异步、事件驱动行为为何是须要的。

重新思考盘算资源的使用为了明白实现反映式应用的原因和方法,我们需要先快速地浏览盘算机的生长历程。显然,在已往的几十年间,它们演化了许多,尤其是在CPU时钟速度(从MHz到GHz)和内存(从KB到GB)方面。可是,最重要的变化发生在最近几年,只管CPU的时钟速度没有显着的增长,可是每个CPU的焦点数量在发生着变化。

在编写本书的时候,大多数的盘算机至少都有4个CPU焦点,已经有厂商提供1024核的CPU。此外,盘算机的整体架构和法式的执行机制并没有履历太显着的演化,所以这种架构的一些限制,如冯•诺依曼瓶颈,会越来越成为一种问题。为了明白这种演化如何影响Web应用的开发,我们来看两个最盛行的Web服务器架构。

1.2.1 基于线程与基于事件的Web应用服务器大致来讲,Web服务器可以接纳两种类型的编程模型。在基于线程的模型中,会有大量的线程来卖力处置惩罚传入的请求。在基于事件的模型中,会有少量的请求处置惩罚线程,它们之间通过消息通报来相互通信。

反映式Web应用服务器接纳的是基于事件的模型。1.基于线程的服务器对于基于线程的服务器,如Apache Tomcat,我们可以将其想象为有多个站台的火车站。火车站的主管(acceptor线程)卖力决议每趟列车(HTTP请求)要经停哪个站台(请求处置惩罚线程)。在同一时刻,所允许的最大列车数量与站台数量相同。

图1.2所示为基于线程的Web服务器处置惩罚HTTP请求的运行机制。图1.2 基于线程的Web服务器的运行机制顾名思义,基于线程的Web服务器要依赖于众多的线程和行列。

列车与基于线程的Web应用服务器的类比关系见表1.2。表1.2 将基于线程的Web应用服务器想象为火车站2.基于事件的服务器为了论述基于事件的服务器是如何运行的,下面以餐厅的服务员为例举行说明。服务员可能收到多个主顾的订单,并将它们送到厨房的多个厨师手中。

服务员会凭据手头的差别任务分配自己的时间,而不是在一项任务上花费太多的时间。他们不需要一次性处置惩罚整个订单:先上饮料,然后上主菜,最后上甜点和咖啡。这样服务员才气同时有效地服务于多个桌位上的主顾。

在编写本书的时候,Play是构建在Netty之上的。用Play构建应用时,开发人员需要实现厨师的行为,即生成响应,而不是服务员的行为,这些行为Play已经提供了。

基于事件的Web服务器的运行机制如图1.3所示。图1.3 基于事件的Web服务器的运行机制在基于事件的Web服务器中,传入的请求被切分为事件,这些事件代表了处置惩罚整个请求的历程中所涉及的各个更小的事情,如剖析请求体、从磁盘获取文件或者对其他Web服务的挪用。切分的历程是由事件处置惩罚器来完成的,它们可能会触发I/O操作,进而发生新的事件。

例如,我们要提倡一个请求,获取Web服务器上某个文件的巨细。在这种场景中,处置惩罚这个请求的事件处置惩罚器会向磁盘提倡一个异步的挪用。当操作系统获得了该文件的巨细后,它会提倡一其中断,这会发生一个新的事件。

轮随处理这个事件时,所获得的响应就会包罗文件的巨细了。当操作系统在盘算文件的巨细时,事件轮询机制能够处置惩罚行列中的其他事件。在事件编程模型中,很重要的一点就是花在每个任务上的时间要很少。

如果某位厨师坚持将服务员给他的订单全部处置惩罚完再上菜的话,那么当服务员过了良久终于从厨房出来的时候,他将面临的是许多因没有获得招待而怒不行遏的主顾。只有整个管道都是异步的,事件模型才会有效:订单或者是HTTP请求,在处置惩罚的时候,没有阻塞。

术语非阻塞I/O通常用来指输入-输出操作,在完成它们的事情时,不会占用当前正在执行的线程,而是在任务完成时发送一个通知。3.基于线程和基于事件的Web服务器的内存使用情况基于事件的Web服务器在硬件资源的使用方面要比基于线程的Web服务器体现更好。我们不用建立成千上万个像“列车轨道”那样的事情者线程来处置惩罚大量的传入请求,只需要几个“服务员”线程就可以了。

使用较少数量的线程会有两个优势:淘汰内存占用和提升性能,而性能的提升主要归因于淘汰上下文切换的次数、线程切换的时间以及调理的开销。在JVM中,所建立的每个线程都有自己的栈空间,默认是1MB。Apache Tomcat默认线程池是200MB,这就意味着为了启动起来,Apache Tomcat需要200 MB的内存。与之形成鲜明对比的是,只需要16MB的内存就能运行一个简朴的Play应用。

现在,200 MB算不上是很大的内存,但别忘了,同时处置惩罚200个传入的HTTP请求就会需要200MB,这还没有思量处置惩罚这些请求所涉及的分外任务将泯灭的内存。如果想要同时满足10 000个请求,就会需要大量的内存,可是这些内存并纷歧定始终可用。在面临大量并发用户时,基于线程的模型扩展起来之所以会很是难题,是因为它的内存需求纷歧定能够获得满足。

、除了要用到大量内存,基于线程的方式也无法高效地使用CPU。1.2.2 开发适合多核架构的Web应用基于线程的Web服务器依赖于多个线程池来为传入的请求分发可用的CPU资源。这种机制对开发人员来说基本上是隐藏的——让开发人员认为只有一个主线程。

客观来说,基于这种抽象机制举行开发,能够隐藏处置惩罚多线程所带来的庞大性增加,在初期来看似乎更简朴。实际上,像Servlet API这样的规范会给我们一种错觉,那就是只有一个主线程在执行,它在响应传入的HTTP请求,而且所有可用的资源都在响应该请求。

但现实是有一些差异的,这个有毛病的抽象有自己的缺点。1.共享可变的状态和异步编程如果所构建的Web应用是由基于线程的服务器来提供服务的,那么你很可能遇到过使用共享可变状态所引发的竞态条件。在JVM上,只管线程是并行运行的,但它们并不是隔离运行的:它们会会见相同的内存空间、已打开的文件句柄以及其他跨线程共享的资源。

这种问题的一个典型样例就是在Java Servlet中使用DateFormat类,如下所示:private static final DateFormat dateFormatter = new SimpleDateFormat();上面这行代码的问题在于DateFormat并不是线程宁静的。如果有两个线程并发会见,那么它并不会凭据哪个线程在挪用接纳差别的操作,而是用相同的变量来生存内部状态。

这会导致难以预料的行为,从而引发很难明白和分析的缺陷。即即是富有履历的开发人员,也需要花费很长的时间去明白竞态条件、死锁以及其他由这种糟糕情况所引发的稀奇离奇的问题。

这并不是说根据事件方式编写的应用法式就没有共享可变状态所带来的问题,在大多数情况下,都是由应用的开发人员来决议是否要使用可变的数据结构,并决议将这些数据结构对外袒露到什么水准。可是,像Play这样的框架和Scala这样的语言在设计上就不勉励开发人员使用共享可变状态。2.语言设计与不行变状态支持使用不行变状态的语言和工具必须处置惩罚并发会见的Web应用法式这一历程变得更容易了。

Scala编程语言在设计上默认使用不行变的值,而不是可变的变量。只管我们在Java中也可以根据不行变的气势派头来编写法式,可是会比Scala涉及更多的样板式代码。例如,在Scala中声明不行变值的方式如下所示:val theAnswer = 42在Java中,要实现相同的效果需要明确添加final关键字:final int theAnswer = 42看上去,这似乎只是一个很小的差异,可是在编写大型的应用时,这意味着final关键字要使用许多次。

而对于更为庞大的数据结构,如List和Map,Scala提供了版本可变和不行变版本,默认推荐使用的是不行变版本,如下所示:val a = List(1, 2, 3)而对于Java来说,在它的荟萃库中并没有提供不行变的数据结构。我们必须要使用第三方的库,例如谷歌的Guava库,这样才气获得可用的不行变数据结构。3.锁与竞争为了制止对非线程宁静的资源举行并发会见所导致的副作用,我们通常会用到锁,以此让其他线程知道某项资源正处于忙碌的状态。

如果所有的事情都正常运行,那么持有锁的线程会将锁释放,并通知其他等候线程可以实验会见资源了。可是,在有些场景下,线程可能会等候另一个线程释放锁,从而陷入死锁。

2022世界杯登录官网在线入口

如果一个线程持有资源的时间太长,从其他线程的角度来看,那么这可能会导致资源饿死。如果Web应用的负载大量依赖于锁,那么泛起锁竞争就不是什么稀有的事情,这会导致整个应用性能的下降。

CPU厂商所提供的新式多核架构并没有改善这种现状。如果一个CPU能够提供1000个真正的执行线程,可是其应用需要依赖锁来同步内存中几块内存的会见,那么我们可以想象这种机制会带来何等严重的性能损耗。

显而易见,我们需要一种越发适用于多线程和多核范式的编程模型。4.异步编程的庞大性恒久以来,在开发人员群体中,编写异步法式并没有真正盛行起来,这是因为它要比编写老式的同步法式更难题。与同步法式中操作的顺序序列差别的是,当我们根据异步气势派头编程时,请求处置惩罚历程可能会被拆分为多个片段。在编写异步代码时,一种很盛行的方式就是使用回调。

法式的执行流程在等候操作完成时(如从远程的Web服务检索数据时)并不是阻塞的,所以开发人员需要实现一个回调方法,当数据可用的时候就会执行这个方法。支持线程编程模型的人可能会认为流程稍一庞大,就会导致名为“回调地狱”的代码气势派头,如法式清单1.1所示。法式清单1.1 JavaScript中回调嵌套的样例var fetchPriceList = function() { ⇽--- 主函数由条目列表及其价钱所组成 $.get('/items', function(items) { ⇽--- 第一个回调方法处置惩罚条目的获取var priceList = []; items.forEach(function(item, itemIndex) { ⇽--- 第二个回调方法的挪用是针对每个条目的 $.get('/prices', { itemId: item.id }, function(price) { ⇽--- 第三个回调方法处置惩罚每个条目价钱信息的获取priceList.push({ item: item, price: price }); if ( priceList.length == items.length ) {return priceList; } }).fail(function() { ⇽--- 第四个回调方法举行价钱信息无法正常获取的错误处置惩罚priceList.push({ item: item }); if ( priceList.length == items.length ) {return priceList;} });} }).fail(function() { ⇽--- 第五个回调方法举行条目信息无法正常获取的错误处置惩罚alert("Could not retrieve items"); });}可以想象,如果要从更多的源获取数据,那么回调嵌套的层级会进一步地增加,代码会越发难以明白和维护。

现在,有许多关于“回调地狱”的文章,甚至另有一个针对该问题的callbackhell网站,而在较大型的Node.js应用中,经常会遇到这种问题。可是,编写异步应用并非一定要如此艰难。回调作为一种抽象,在编写庞大的异步流时,显得过于底层。在编写更易于明白的异步法式方面,JavaScript只是没有跟上工具和抽象的程序,可是像Scala这样的语言在设计时就思量到了这些抽象,它使用了众所周知的函数式编程原则,从而有可能从差别的角度解决这个问题。

5.编写异步法式的新颖方式受函数式编程理念启发的工具能够极大地简化多步回调的处置惩罚,这些理念包罗Java的lambda表达式或Scala的一阶函数。除了内置在编程语言中的工具, Future和Actor这样的抽象也是很强大的方式,可以用于编写和组合异步的请求处置惩罚管道,在很大水平上消除“回调地狱”的影响。

从下令式、同步气势派头的应用编写方式转换为越发函数式和异步的气势派头并不是一蹴而就的。通过接纳基于事件的请求处置惩罚模型,Play能够更好地使用盘算机的资源。

即便我们已经有了很是高性能的请求处置惩罚管道,当到达服务器的硬件极限时,又该怎么办呢?接下来,我们看一下Play如何资助我们水平扩展至多台服务器。1.2.3 水平应用架构在开发Web应用时,必须要做一些基础的选择,这些选择对Web应用如何运维有着深远的影响。但令人遗憾的是,在开发Web应用时通常并不会思量代码交付并部署到生产情况服务器之后所发生的事情。

这会带来很严重的局限性,例如在一台以上的盘算机上运行应用的情况下,如果应用从设计之初就没有思量这种部署模式,那么它很可能无法根据这种方式来实际运行,除非做一些显着的代码变换。在下面的讨论中,我们将会探讨几种部署模式,并思量其收益和局限性。我们还会看一下所谓的水平部署模式的优势——反映式应用能够实现这种模式,而且会主要使用该模式。

1.单服务器部署单服务器部署是一种很常见的部署模式,是指Web应用部署在一台盘算机上,而数据库通常会部署在相同的盘算机上,如图1.4所示。图1.4 单服务器部署模式这种部署被广泛接纳,这主要归因于它的简练性,可是它也有几项很重要的局限性。当服务器的负载凌驾硬件的处置惩罚能力、硬件泛起故障或者需要安装宁静或应用自己的更新时,应用会不行制止地泛起不行会见的现象。

接纳这种部署形式时,可用的负载在很大水平上依赖于硬件——当需要更高的性能时,需要使用更强大的盘算机,这种盘算秘密有更多的内存和更快的CPU。通过切换至更高性能的硬件来增加服务器负载能力的历程称为垂直扩展。2.副本部署对于需要更高可用性和性能的应用来说,一种盛行的搭建方式就是在两台盘算机上构建数据的副本,如图1.5所示。

图1.5 副本部署模式接纳这种模式的部署时,数据库和服务端状态(例如服务端用户会话或缓存)都需要接纳副本的方式(通过使用Apache Tomcat的集群或类似功效)。在数据库层面,可以接纳master-to-master副本的方式。

这种解决方案能够使应用依次更新,从而保证应用在更新时是可用的。可是,在搭建这种类型的情况时,正确设置的庞大性在于副本的数量往往并不局限于两个。

从开发人员的角度来看,Web应用依然会像在单台盘算机上运行那样举行开发,底层框架或应用服务器卖力处置惩罚服务器状态的副本。多机搭建的庞大性其实并没有消除,而是将贫苦推到了应用服务器上。这导致很难优雅地处置惩罚错误状态(在不外分打扰用户的情况下),因为错误会在差别层级泛起,并不局限于应用自己,而且它不会是首先需要思量的问题。

3.水平部署在水平部署模式中,相同版本的应用部署到了多个节点上,如图1.6所示。这些节点可能是物理盘算机,也可能是虚拟机,它们有一个很重要的特点,那就是相互之间不知道对方的存在,不共享任何状态。这种无共享原则是所谓的无状态架构的焦点,在这种架构中,每个节点是自包罗的,它的存在或消失不会以任何方式影响其他节点(不外,凭据流量的情况,可能会提高或降低负载处置惩罚能力)。

这种架构的优势在于应用可以很容易地举行扩展,只需在前端路由添加新的节点,而更新时可以添加带有新版本的新节点,然后让路由层指向这些新节点即可。这种所谓的热重部署机制在平台即服务提供商中很是常见,如Heroku。图1.6 水平部署模式在存储层,与非共享Web应用层配合比力好的是支持某种形式集群的存储技术。

像MongoDB、Cassandra和Couchbase这样的NoSQL数据库以及新版本的关系型数据库(如WebScaleSQL),都是很是适合可扩展前端架构的存储技术。使用水平部署模式的一个效果就是用户可能会毗连到任意一个前端节点上,这取决于路由层,这种方式并不会保证始终毗连到相同的节点上。

因为节点之间没有共享的状态,所以服务端的会话(Servlet尺度和基于该尺度构建的框架中会默认存在)就无法使用了。Play框架在焦点中接纳了非共享的理念,并基于cookie提供了客户端会话。因为Play内存占用很少,所以它很是适合通过PaaS或其他基于云的平台举行多节点部署,在这些部署情况中,单个节点的可用内存通常要比专属服务器少得多。将故障处置惩罚作为第一思量因素当纽约证券生意业务所在2012年8月1日早上9:30开盘的时候,骑士资本团体的自动生意业务软件就开始自动举行股票生意业务,这个软件的业务功效就是这样设计的而且已经运行了许多年。

最近,应用的新版本在服务器上举行了部署,允许客户与NYSE的零售清算法式举行交互。可是,在8月1日,事情有了一些变化:从开盘到该法式关闭的45分钟内里,这个应用共造成了4.4亿美元的损失。构建不会泛起故障的应用是很是难的,如果应用要根据一个合理的节奏来举行构建,那么想制止故障险些是不行能的。

反映式应用不会勉力制止故障,而是会根据包容故障的理念去设计和构建应用,它接纳了羁系的原则,如果KCG接纳这种方式去构建,那么可能会制止悲凉的运气。反映式应用能够自行探测到故障,并自动举行恢复或者降级,将灾难性损失降至最低。

要明白如何应对故障,我们首先看一下都有哪些因素可能会堕落,然后仔细分析一下故障为何是不行制止的(对于这一点,你可能并未完全信服),以及接纳什么样的技术能够应对故障。《反映式Web应用开发》[奥地利]Manuel Bernhardt 著本书分为4个部门,由浅入深地先容了响应式Web开发的各项技巧。从认识响应式,到解说响应式的特点,以及如何完成响应式Web开发,本书都给出了很是清晰且详细的指导步骤。读者能够在本书中获取到重要的开发技术,而且能够从实例中获得更多实用的开发技巧。

今日互动你认为本书有什么差别?停止10月29日17时,留言+转发本运动,小编将抽奖选出2名读者赠送纸书1本。


本文关键词:2022世界杯登录官网,你,真的,相识,反映,式,Web,编程,吗,在,已往,的

本文来源:2022世界杯登录官网-www.womackfoundation.com