【编者按】本文作者为 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能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
原文地址: https://dzone.com/articles/why-reactive-programming-is-not-a-fad
相关推荐
一次内部分享的PPT,从函数式编程的优点到响应式结合原因,Rx的周期,应用的举例,源代码的解读,到MVVM的应用的介绍
CwlSignal-master这个文件名可能是该响应式编程框架的源码仓库主分支,暗示这是一个名为CwlSignal的开源项目。CwlSignal可能是一个为Swift设计的信号(Signal)库,类似于 ReactiveCocoa 或 RxSwift,这些库都允许...
响应式编程是一种编程范式,它允许程序员以声明式的方式处理数据流和变换,使得程序能够更高效地处理异步和并发操作。在Java生态中,Reactor与Flux是两个核心概念,它们是Spring Framework的重要组成部分,用于实现...
Spring Boot 2响应式编程 学习要求 -熟悉Spring基础 -熟悉Maven使用 基于SpringBoot2.3与2.4版本讲解,适用于有Spring、SpringMVC基础,初学或想深入了解SpringBoot的学习者。 教程包含核心基础、Web原理、单元测试...
Spring5 WebFlux 是Spring框架在第五个主要版本中引入的一个重要特性,它引入了响应式编程模型,为开发人员提供了构建高性能、非阻塞Web应用程序的能力。响应式编程是一种编程范式,它强调通过异步数据流和反应式...
响应式编程是一种编程范式,它强调数据流和变化传播的概念,使得程序员可以编写出能够自动反应数据变化的代码。在iOS开发中,Swift虽然原生并不支持响应式编程,但我们可以通过KVO(Key-Value Observing)或者第三方...
本项目首次将Spring Boot 2.x与全响应式编程相结合,打造了一个高效、灵活的企业级后台管理系统基础项目。 首先,我们要理解Spring Boot 2.x的核心优势。Spring Boot 2.x基于Spring Framework 5,引入了许多新特性...
本SpringBoot2响应式编程与核心技术设计源码项目包含588个文件,主要使用JavaScript、CSS、Java、HTML编写。系统专注于SpringBoot2的核心技术和响应式编程,...项目适用于需要掌握SpringBoot2响应式编程技术的开发者。
在本篇中,我们将深入探讨Spring Webflux的响应式编程模型,这是Spring框架的一个重要扩展,旨在提供非阻塞、事件驱动的Web服务开发能力。WebFlux是Spring Framework 5.0引入的新特性,它支持反应式编程,能够更好地...
EasyReact:美团开源的简易版响应式编程库.zip,The library is deprecated. Please move to https://github.com/Meituan-Dianping/EasyReact
读书笔记:MVP模式代码解耦 + RxJava线程调度响应式编程 + Retrofit2网络请求
在软件开发中,观察者模式是一种常见的设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JavaScript中,观察者模式可以通过多种方式实现,包括...
演讲中,臧成威探讨了声明式编程的不同形式,特别是响应式编程,并介绍了美团客户端在面对代码量庞大、多团队协作、快速迭代和高质量要求等挑战时所进行的架构变迁。 声明式编程是一种编程范式,其中包括了响应式...
反应式编程的解决方案是基于多线程(协程)、异步方法调用、异步 I/O 访问等技术基础之上,提供了一整套与异步调用相匹配的编程模型,从而实现程序调用非阻塞、即时响应等特性。反应式编程的主要特点是基于观察者...
响应式编程是一种编程范式,它允许以声明式的方式表达异步数据流的变换和交互。在响应式编程模型中,数据流和变化传播是自动的,使得开发人员能够专注于业务逻辑而非线程管理。 响应式系统(Reactive Systems)则是...
为了帮助你快速入门响应式Web设计,我写了一篇快速入门教程。我保证你通过三步就可以学会响应式设计的基本逻辑和媒体查询(media query)(假设你有基本的CSS知识)。 第一步:Meta标签(看demo) 大部分移动浏览器会...
Objective-C,作为苹果平台的主要编程语言之一,虽然原生不支持响应式编程,但可以通过一些库和框架来实现,例如ReactiveCocoa。本项目"QCReactiveThinkTest"旨在通过KVO(Key-Value Observing)来演示如何在model和...
Java编程方法论响应式RxJava与代码设计实战
Spring WebFlux结合Reactor库,为开发者提供了在Java和Spring中进行响应式编程的强大工具。通过函数式和注解式API,以及响应式数据访问,可以构建出高性能、低延迟的Web应用程序,适应现代云原生环境的需求。理解并...