为什么响应式编程并非一时之势?
【编者按】本文作者为 David Buschman,文章从程序架构与系统的发展历程出发,逐步论证了为什么响应式编程并非一时之势,而是能带来更快处理速度,更高硬件利用率的未来选择。文章系国内 ITOM 管理平台 OneAPM 编译呈现。
这些年来,程序架构和系统发生了不少变化。大部分情况下,这些变化都跟它们依托的硬件密切相关。软件架构到底是从何处起源,众说纷纭,而且对构架的实际构成部分也有各种定义。本文将从整体化应用的兴起来展开讨论。
摩尔定律
当你的所有资源都在单机上时,把所有的代码存在一个地方很合理,而且是软件设计的黄金标准。这种模式一直持续到 J2EE 时代,整体化应用容器的出现。J2EE 的设计初衷就是为了能充分利用摩尔定律,因为这是变得越来越庞大的单核 CPU 系统的最佳设计方法。
摩尔定律指的是一个观察发现:在计算机硬件发展史上,密集的集成电路上的晶体管数量大概每两年就会翻一倍。
这种构架作为黄金标准持续了几十年,因为如果我们要衡量一个系统,就会往它身上“堆”更多硬件。添加更快的 CPU 和更多内存来提高应用程序的速度。这就是摩尔定律所说的应用程序。
多核处理器的兴起
就在几年前,CPU 制造商开始在 CPU 设计和速度方面遭遇瓶颈。他们怎么都没办法给单核 CPU 提速了。为了解决这个问题,芯片制造商开始“尽情发挥”,在一个芯片上加了好几个核,以便获得更多加速的能力。这意味着过去那种给 J2EE 应用程序添加一个时钟速度更高的 CPU 来提速的老方法行不通了。如果 CPU 无法再提速,应用程序如何通过新一代的多核处理器来扩大规模呢?必须改变现有的应用程序设计和运行方式,才能保持竞争力。
而且,事实证明,Java 企业级应用程序的同步和阻塞 IO 构架并不能充分利用这些新处理器的所有核。主要原因是它们的线程模型是“一个请求一个线程”,由于阻塞 I/O 命令,无法工作,这些线程要耗费大量时间来“等待 IO”。
阿姆达尔定律
这时候,阿姆达尔定律就开始发挥作用了。在目前的处理器中,该定律是现代新构架的驱动力。现在有了更多核,就需要找到办法来充分利用我们购置的这些 CPU。要实现这一点,需要减少应用程序使用非阻塞 I/O 命令带来的“IO 等待”时间。这对过去几十年的运行模式而言是一个彻底的改变。
Java 企业级应用程序和一个请求一个线程模型
显然,Java 企业构架是在单核 CPU 盛行时设计的。它对发送到服务器的请求采用“一个请求一个线程”思维方式。一旦你的请求获得一个线程,这个线程就会持续该请求的整个处理过程。在这种空间常用的函数库甚至依赖这种模型才能使用,例如 Hibernate 和 Spring Security。两个库都使用“Thread-local”参数来保持“session”状态,因为它们知道同一个线程会持续一个请求的整个周期。这样做的重大不利影响就是“behavior”不能更改,否则就会破坏现在使用的大部分 JEE 程序的数据持久性和应用安全代码。
Lightbend 和响应式宣言
Lightbend 公司(前身是 Typesafe)发布了响应式宣言,以记录未来软件设计时需求的变化,以及当代多核 CPU 在未来世界的扩展性。这种范式转变太过巨大,因此很难简单说清两种构架风格之间的真正不同,就如同拿苹果跟橙子做对比一样。这种转变在行业内带来了一些混乱,而且还会持续下去,直到完成过渡,找到让多核 CPU 充分发挥潜力的方法。
该宣言列出了构架系统时应该着重考虑的四条原则,以便新系统能够满足所需的处理水平。其中有两个概念直接适用于解决 Java 企业应用程序的问题,就是非阻塞 I/O 和非同步处理。如果两项都做好了,应用程序可以占用更少的 CPU 和内存需求,完成更多任务,从而在任何一个系统、同样的硬件基础上,获得比 Java 企业应用程序更好的处理效果。下图展示了这种并行处理的好处。
更快,更好,成本更低
这种新的软件架构新方法带来了更短的处理时间和更高的硬件利用率,从而降低了运营成本。现在运行的很多大型系统都是基于响应式宣言及其原则打造的。LinkedIn、Twitter、Facebook 等很多企业使用的系统都是基于非同步和非堵塞 I/O 技术架构,因此他们的应用程序得以优化,能够最大化地利用硬件资源。这是打造可扩展型应用程序的新方法,而且正在迅速发展。“响应式方法”并非一时之势——它是编写软件的未来趋势。
本文转自 OneAPM 官方博客
原文地址: https://dzone.com/articles/why-reactive-programming-is-not-a-fad
为什么响应式编程并非一时之势?相关推荐
- 响应式编程入门:实现电梯调度模拟器
据说每个程序员等电梯的时候都思考过电梯的调度算法-所以怎么动手实现一个呢?虽然这个场景貌似有些复杂,但却非常适合使用响应式编程的范式来处理.下面我们会在 RxJS 和 Vue 的基础上,一步步实现出一 ...
- Java的HTTP服务端响应式编程
传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...
- angular input_可视化的 Angular 响应式编程
现代化UI开发中,客户端(前端)一般会进行分层设计,实际用户可感知的 UI 作为顶层,称为视图(View),底层中独立于展示方式的数据结构称为模型(Model),而将两者进行关联的中间层部分,根据划分 ...
- 响应式编程之一:概述
什么是响应式编程(Reactive Programming) In computing, reactive programming is an asynchronous programming par ...
- 1. 响应式编程的前世今生及实践
文章目录 前言 1. 响应式编程及其起源与发展 1.1 什么是响应式编程 1.1.1. 直观感受 1.1.2. 定义 1.2 起源与发展 1.2.1 发展历史 1.2.2 响应式系统 1.2.3 框架 ...
- 响应式编程之网络新约:RSocket
响应式reactive是Java中高效应用的下一个前沿,但它目前主要有两个障碍:数据访问和网络.RSocket是一种新的第7层语言无关的应用网络协议(解决后者),它由Facebook,Netifi和P ...
- 响应式编程 函数式编程_函数式编程简介
响应式编程 函数式编程 根据您要求的对象, 函数式编程 (FP)是一种应运而生的开明编程方法,或者是一种在实践中几乎没有实际好处的过于学术化的方法. 在本文中,我将解释什么是函数式编程,探讨其好处,并 ...
- ios架构与开发第五课 BFF、MVVM和响应式编程
15 跨平台架构:如何设计 BFF 架构系统? 上一模块,我和你介绍了iOS 工程化实践中的基础组件设计, 接下来这部分,我们将进入核心内容:移动端系统架构的设计与实现. 首先请你想一想:如果没有一套 ...
- 响应式编程笔记(二):代码编写
2019独角兽企业重金招聘Python工程师标准>>> 响应式编程笔记(二):代码编写 博客分类: 架构 原文:Notes on Reactive Programming Part ...
最新文章
- boost::geometry::is_empty用法的测试程序
- python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...
- 面试被问进线程的区别
- 记录一次服务器大中间表优化的问题(数据倾斜的解决)
- Java Web解决跨域请求,java初级面试笔试题
- linux连同目录一起删除,linux中文件的常用操作
- Wireshark系列之5 显示过滤器
- 【Linux】Cachecloud安装部署图文并茂
- python编译原理 书籍_如何想学点编译原理,又不想直接看龙虎之类的书籍,太多理论,干燥?...
- “云上贵州”成全国首个国密算法应用试点项目 阿里政务云实现“国家级”安全保护...
- 微信小程序之五星评分效果
- JAVA300集——面向对象编程-类和对象-构造方法及其重载-方法调用
- SpringBoot 下载打包图片
- element-ui el-dialog侧边弹窗可横向拖拽改变宽度
- React 入门教程笔记
- 我的世界java版怎么找史莱姆区块_我的世界史莱姆在哪里
- TS装饰器、混入Mixins、TS模块、命名空间
- QEMU的基本使用方法(MIPS)
- VRTK4开发VR3:通过手柄进行移动
- PHP设计模式系列:目录