本文由 Shaw 发表在 ScalaCool 团队博客。

原书

www.manning.com/books/react…

第一章:你是说「响应式」?

本章内容

  • 响应式应用及其起源

  • 为什么响应式应用是必要的

  • Play 如何帮你构建响应式应用

概览

在过去几年,Web 应用开始在我们的生活中发挥越来越重要的作用,不论是像社交网络这样的大型应用、电子银行站点这样的中型应用,还是一些小型应用,如在线账户系统以及一些小型企业的项目管理工具,它们对这些服务的依赖呈现出明显增加的趋势。而这一趋势现在也转向了物理设备,根据信息技术研究与咨询公司 Gartner 的预测,到 2020 年物联网设备将增至260亿台。

这一快速演变对高可用性以及资源效率提出了更高的要求,而响应式应用就是为此而量身定做的。以前的 Web 程序开发一般都是利用一个应用程序尝试解决各种问题,但随着云计算的出现与云服务的接踵而至,应用程序可以连接到云服务,只需解决那些剩余没有很好解决的问题。

所以我们需要一套新的工具来有效地应对这一演变带来的挑战。Play! 框架是一套崭新的方案,以便构建出能够实时响应用户行为的 Web 应用程序,即使在高负载和分布式的环境下也是如此。

在撰写本文时,Play! 是 Java 虚拟机上唯一真正的全栈响应式 Web 应用程序框架。作为一款免费且开源的软件,Play! 已经被许多大公司所采用,比如 摩根士丹利(Morgan Stan-ley)、领英(LinkedIn)、卫报(The Guardian)等,当然还有许多小型的 Play! 玩家。Play! 随时等着你去下载把玩呢!

在本章中,我们将探究:

  • 响应式 Web 应用程序是什么
  • 为什么要构建这样的程序
  • 以及为什么 Play! 是构建这种程序的好工具。

我们将首先澄清「响应式」一词的意思,并探讨在新的硬件设计和软件架构的趋势下,如何重新考虑使用可计算资源。最后,还将探究为什么失败处理起着关键性的作用,以及如何去实现相应的逻辑。

1.1 特定场景下的「响应式」

如果你正在阅读本书,你可能听过诸如「响应式应用」、「响应式编程」、「响应式流」或「响应式宣言」等概念。这些词加上「响应式」前缀后感觉更加高大上了,但是你可能会去思考在这些不同场景下「响应式」的含义。那就让我们去看看这个词在计算机系统中的起源,从中寻求答案。

1.1.1 「响应式」的起源

「响应式系统」并不是一个新的概念。David Harel 和 Amir Pnueli 在《关于响应式系统的发展》(1985年出版)的论文中就收集整理了几个二分法,以此来表征复杂的计算机系统,并提出了一个新的二分法:转换系统与响应式系统。转换系统接受一组已知的输入,然后转换这些输入,最终产生输出。例如,转换系统可以提示用户进行一些输入,然后再根据用户提供的内容来提示用户,并最终产出结果。

思考一下,比如,袖珍计算器,它接受数字并执行基本操作,以便在按下等号键时最终返回结果。另一方面,响应式系统由外部环境持续刺激,其作用是不断响应这些刺激。例如,具有运动监测测功能的 WIFI 摄像机可以注意到小偷进入了房间,然后它会向摄像机主人的手机发送警报,于是他们无助地目睹了小偷将其房间里的贵重物品洗劫一空,以及不久之后警察到达现场的情景。

几年后,Gérard Berry 通过介绍交互式程序和响应式程序之间的区别来改进了这一定义。 交互式程序与环境交互的速度由程序本身决定,而响应式程序则由外部环境决定。

因此,响应式程序能够:

  • 持续与它们的环境进行交互

  • 交互速度由外部环境而不是程序本身决定

  • 对外部的需求进行响应

让我们再回到当下,响应式程序以前的操作,看起来很像是 Web 应用程序的运行方式,或者说是 Web 应用程序应该如何运行。尽管这在理论上很有吸引力,但是要实现这些标准难度很大,并且当系统的用户量增加以及系统所需要的性能提高时,对硬件资源的要求也提出了一个很严峻的挑战。因为缺乏广泛的高性能硬件去实现大规模的实时交互,所以一直到最近几年之前「响应式系统」都没有经常被提及,直到「响应式宣言」 的出现,这份「宣言」阐明了响应式系统的一系列核心特征。

1.1.2 「响应式」宣言

响应式宣言的第一个版本在 2013 年 6 月发布,它描述了「响应式应用程序」的软件架构体系。 「响应式应用程序」的定义中包含了许多特性,这些特性使得应用程序能够像我们前面讨论过的响应式程序那样 —— 持续可用以及实时响应外部需求。虽然 响应式宣言 看上去似乎是在描述一种全新的架构模式,但其核心原则在一些需要 IT 系统能够实时响应的行业中早已被广泛接受,比如金融交易行业。

下面这四个特性组成了响应式应用程序:

  • 响应式——响应用户

  • 可伸缩——响应负载

  • 弹性化——响应失败

  • 事件驱动——响应事件

响应式应用程序要能满足用户对可用性以及实时响应行为的期望。所谓实时,或者说类实时,意味着应用程序能够在短时间或者极短时间内作出响应。请求和响应之间的时间间隔我们称为「延迟」,它是评估一个系统执行情况的关键测量之一。

为了能够持续地与所在环境进行交互,响应式应用要能够适应它们所面临的负载。突然的流量爆发可能会对程序造成一定的影响;比如,一条带有新闻外链的热门推特可能会对外链指向的新闻网站造成冲击。因此,应用程序必须是可扩展的,必要时,能够增加其计算能力。这就意味着应用程序不仅要能在一台机器上(可能具有一个或者多个CPU内核)有效地使用硬件资源,而且,当系统负载增加时,它还要能在多个计算机节点上运行。

  • 注:我们使用术语「计算机节点」或简称为「节点」来指代运行 Web 应用程序的资源。 实际上,这可能指的是物理计算机,虚拟机,甚至是服务提供商上的逻辑节点。

因为即使是最简单的系统也容易出现故障(不论是与软件相关还是与硬件相关),所以,要想让系统持续可用,响应式应用程序必须能够弹性化地处理失败的情况。当涉及到可伸缩性系统时,应用程序面对问题之后的恢复能力将变得更加重要,因为这类系统在本质上以及分布上面的复杂程度会导致其在硬件以及网络上面出现故障的几率增加。

基于异步通讯的事件驱动应用程序能够使我们的系统具有前面列举出的那几个特性。在这种设置下,系统(或子系统)能够对诸如 HTTP 请求之类的离散事件发生反应,而不需要在等待事件发生时独占计算资源。与传统的同步方法调用相比,这种自然级别的并发性带来了更低的延迟。编写事件驱动程序的另一个结果是组件松散耦合,长远来看,这会使得软件更加易于维护。

[译] 响应式 Web 应用(一)相关推荐

  1. CSS3: Media Query实现响应式Web设计

    十一长假已然过去了一大半.今天倒真是晴朗的不行,向窗外望去几乎可以看到阳光穿过凉爽的空气一缕缕洒落下来的样子.自从不再是学生,对每年的几次 长假就无比珍惜,想方设法让每一天都尽量过的饱满一些:夜里闭上 ...

  2. 50种响应式web设计的奇妙工具

    在您开始着手响应式站点的搭建之前,如果能拥有强有力的开发工具会让您的世界另有一番风采.本文中Denise Javobs和Peter Gasston推荐了50种强大的工具来支持您建造响应式站点的过程. ...

  3. 通过响应式web设计,使本站支持手机浏览

    2019独角兽企业重金招聘Python工程师标准>>> 2014-01-28 14:49:14 现在越来越多的人通过手机来上网,手机由于屏幕尺寸的原因,当浏览为PC端浏览器设计的网页 ...

  4. 《响应式Web设计:HTML5和CSS3实践指南》——2.9节基于位置伪类的交替行样式

    本节书摘来自华章社区<响应式Web设计:HTML5和CSS3实践指南>一书中的第2章,第2.9节基于位置伪类的交替行样式,作者(美) Benjamin LaGrone,更多章节内容可以访问 ...

  5. 十大响应式Web设计框架

    2019独角兽企业重金招聘Python工程师标准>>> 本文将分享十款最佳的响应式Web设计,助你大大简化工作流程. Gumby Framework Gumby 2是建立在Sass基 ...

  6. 《响应式Web图形设计》一13.2 缩放图像带来的问题

    本节书摘来异步社区<响应式Web图形设计>一书中的第13章,第13.2节,作者: [美]Christopher Schmitt 译者: 曾斌 责编: 赵轩,更多章节内容可以访问云栖社区&q ...

  7. 《响应式Web设计全流程解析》一1.2 静态设计稿舒适区

    本节书摘来异步社区<响应式Web设计全流程解析>一书中的第1章,第1.2节,作者: [美]Stephen Hay 译者: 余果 , 等 责编: 赵轩,更多章节内容可以访问云栖社区" ...

  8. HTML5和CSS3响应式WEB设计指南译者序

    "不是我不明白,这世界变化快."崔健的这首歌使用在互联网领域最合适不过.只短短数年的功夫,互联网的浪潮还没过去,移动互联网的时代已经来临.人们已经习惯将越来越多的时间花在各种移动设 ...

  9. 基于php响应式网站毕业论文,基于html5与css3的响应式web页面设计与实现.docx

    内容摘要:随着现代社会的不断发展,人们的需求不断变化,不断的创新才能更好的满足人们的需求.从智能设备的出现,到如今不过短短十年,设备尺寸的多样化,传统的网页设计已不能满足现如今多样化的设备通用需求.如 ...

最新文章

  1. int(1) 和 int(10) 有什么区别?资深开发竟然都理解错了!
  2. 京东程序员被同事吐槽:需求排期长拖黄业务,都研发的一些啥玩意
  3. 读书笔记:《HTML5开发手册》--figure、time、details、mark
  4. 记录安装mysql5.7.24遇到的坑
  5. nDPI流量协议分析(应用软件识别)
  6. SQL-10 获取所有非manager的员工emp_no
  7. tigervnc远程控制linux,CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面(示例代码)
  8. 2021年中国车轮电机市场趋势报告、技术动态创新及2027年市场预测
  9. 豆瓣小组html模板,用前端的方式打开豆瓣租房小组
  10. 从拉格朗日插值法到范德蒙行列式
  11. Effective C++条款11:在operator=中处理“自我赋值”(Handle assignment to self in operator=)
  12. CSS3(新增样式)
  13. 样本不平衡问题分析与部分解决办法
  14. 获取指定文件夹下所有的同种类型文档的名字(Python)
  15. 4pm 方法操datagrid
  16. SpringCloud-gateway资料以及详解
  17. 矩阵内积、外积(克罗内克积)和Hadamard积
  18. Golang 本地缓存选型对比及原理总结
  19. 维基百科的网址(没被墙)
  20. java 为什么 X/Y的向上取整可以用(X+Y-1)/Y导出

热门文章

  1. 完整的python项目流程
  2. 后台运行定位,音频,网络电话
  3. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型
  4. CentOS查看主板型号、CPU、显卡、硬盘等信息
  5. Android 热修复总结
  6. 《软件工程方法与实践》—— 3.4 面向对象模型
  7. SQL Server 2008创建数据库
  8. 陶哲轩实分析 定理 13.4.5
  9. 【原创】MySQL 5.5 PROXY USER 伪装用户
  10. Windows 8计算机管理器怎么打开?