李智慧 · 高并发架构实战课
李智慧
同程艺龙交通首席架构师,前 Intel & 阿里架构师,《大型网站技术架构》作者
23286 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
李智慧 · 高并发架构实战课
15
15
1.0x
00:00/00:00
登录|注册

11 | 反应式编程框架设计:如何使方法调用无阻塞等待?

快速响应需求
高并发处理
编程方式
配置文件方式
编程方式
配置文件方式
完成业务逻辑
实现Service接口
消息流处理
服务流程初始化
ServiceActor
ServiceFlow
ServiceFactory
Service和HttpService接口
Flower容器
Flower 流程
Flower Service
Akka Actor模型
异步数据库驱动和网络通信
利用Java Web容器异步特性
阻塞式编程的问题
高并发系统开发
支持命令式编程
完全异步
纯消息驱动
函数式编程
观察者模式
Reactor
RxJava
消息驱动
弹性
回弹性
即时响应
异步I/O
异步方法调用
协程
多线程
反应式编程适用场景
落地架构设计
开发框架和工具
技术权威
流程编排
服务注册
服务开发
初始化及调用时序
核心类
Flower框架元素
概要设计
需求分析
目标
设计模式
主流框架
反应式系统特质
异步编程
思考题
架构师角色
开发与注册
详细设计
Flower框架
核心概念
反应式编程框架设计

该思维导图由 AI 生成,仅供参考

你好,我是李智慧。
反应式编程本质上是一种异步编程方案,在多线程(协程)、异步方法调用、异步 I/O 访问等技术基础之上,提供了一整套与异步调用相匹配的编程模型,从而实现程序调用非阻塞、即时响应等特性,即开发出一个反应式的系统,以应对编程领域越来越高的并发处理需求。
反应式系统应该具备如下的 4 个特质。
即时响应:应用的调用者可以即时得到响应,无需等到整个应用程序执行完毕。也就是说应用调用是非阻塞的。
回弹性:当应用程序部分功能失效的时候,应用系统本身能够进行自我修复,保证正常运行,保证响应,不会出现系统崩溃和宕机的情况。
弹性:系统能够对应用负载压力做出响应,能够自动伸缩以适应应用负载压力,根据压力自动调整自身的处理能力,或者根据自身的处理能力,调整进入系统中的访问请求数量。
消息驱动:功能模块之间、服务之间通过消息进行驱动,以完成服务的流程。
目前主流的反应式编程框架有 RxJava、Reactor 等,它们的主要特点是基于观察者设计模式的异步编程方案,编程模型采用函数式编程。
观察者模式和函数式编程有自己的优势,但是反应式编程并不是必须用观察者模式和函数式编程。我们准备开发一个纯消息驱动,完全异步,支持命令式编程的反应式编程框架,框架名称为“Flower”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了反应式编程框架设计的关键特性和实现原理,旨在帮助读者快速了解该框架的概览。文章首先强调了反应式编程的重要性,以及反应式系统应该具备的四个特质:即时响应、回弹性、弹性和消息驱动。接着介绍了一种名为“Flower”的纯消息驱动、完全异步、支持命令式编程的反应式编程框架,以及其实现原理和核心元素。在需求分析部分,文章阐述了传统阻塞式编程模型的局限性,以及Flower框架应该满足的典型Web应用的线程特性。在概要设计和详细设计部分,文章详细介绍了Flower框架的实现原理,包括利用Java Web容器的异步特性、异步的数据库驱动和网络通信,以及基于Akka的Actor模型实现异步无阻塞调用。最后,文章强调了架构师应该具备卓越的代码能力,开发自己的编程框架以及约定的编程规范,以保持自己的技术影响。总的来说,本文对于想要了解反应式编程框架的读者具有很高的参考价值,尤其适合对并发处理需求高、需要快速、及时响应的场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《李智慧 · 高并发架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 👽
    因为异步,无阻塞。我觉得其实最主要解决的是io访问和网络请求。其基本原理是,CPU的运算速度远远高于IO访问(比如磁盘访问,外设访问),更远高于网络请求(局域网内的数据库,或者微服务下的服务间通信) 传统串行化,就好像,我要组装一台电脑,我拿到图纸以后,图纸第一步是组装机箱,我订购了一个机箱3天到货,然后机箱里要放主板,我又定了一个主板2天到货,主板上要放cpu,我又定了一个CPU半个月到货。。。最终一台电脑组装好,两个月过去了。组装时间取决于所有产品订购到货的总时间。 我理解的响应式就是,我收到图纸,发现图纸要CPU,主板,内存,硬盘,机箱。。。我全部发起订购。然后都开始送货,等货全到齐了之后,开始组装。这个时候,组装时间取决于最长到货的那个配件。所以大幅提升了性能。 反过来说,如果你本身不需要io访问,网络调用之类的操作。响应式对于性能的提升其实是很有限的。 应用场景的话,我觉得可以有金融领域的风控。因为风控其实是一整串校验,而且这一串校验服务很可能是独立的。甚至部分服务是由不同的供应商提供的。如果这种业务场景,走串行化之行,执行效率肯定是不可接受的。使用响应式,可以很大程度缓解这个问题。只需要保证,我的每一个风控校验的服务,或者提供商,响应时间控制在一个范围内,就能保证整个请求的执行时间不会太离谱。

    作者回复: 很赞,确实,Akka的很多应用案例都出自金融行业。

    2022-03-15
    2
    10
  • ABC
    老师有推荐的反应式框架吗?最近想学习一下。

    作者回复: Akka

    2022-03-30
    4
  • javaadu
    我是做风控策略引擎的,在策略引擎中,同一个事件过来,需要并行跑很多模型、特征,然后统一决策。这些模型和特征都是外部的系统,对于io并发的要求很高,使用响应式编程有助于减少阻塞环节。 其他的场景,暂时没想到,看看其他同学的回答

    作者回复: 赞,学习了~

    2022-03-26
    3
  • peter
    请教老师几个问题啊: Q1:服务器创建几百个线程与线程公式的矛盾问题。 记得有一个公式,线程数等于CPU核数的2倍。假设CPU有二十个核,则线程数是40。服务器创建几百个线程,有什么用?与这个公式不矛盾吗? Q2:akka是什么意思? Q3:目前的主流JAVA开发中有响应式开发框架吗? A JDK中有响应式开发的东西吗? B 目前微服务一般用SpringBoot/SpringCloud,这两个部分有响应式开发的东西吗? C 后端架构,常见的组件:Nginx、Redis、MQ(e.g,RocketMQ)、ES,这几个组件有响应式开发的东西吗? Q4:Flower的消息部分是怎么实现的?队列吗? Q5:RxJava也是封装Actor、消息驱动吗? Q6:这个框架开发难度大吗?老师一个人多长时间能完成开发?

    作者回复: 1 其一,最佳线程数不止和CPU数目有关,还有IO等待时间有关,这正是Flower关注的,线程公式如下: 最佳线程数=[任务执行时间/(任务执行时间 - IO 等待时间)] * CPU 内核数 其二,应用程序开启多少线程,和以上指标都没关系,想开多少开多少。 2 https://akka.io/ 3 文中提到两种反应式编程框架,都是Java框架 A Java Streaming B Flutter,另外,Flower也是一个反应式微服务框架,更彻底的反应式微服务,具体可以看github文档 C 没有,反应式编程和这些没关系 4 利用Akka Actor传递消息 5不是 6 第一个版本,一个人一个月,具体可以看git log

    2022-03-11
    3
  • 雪碧心拔凉
    妙啊,一直没明白响应式怎么响应信息给客户端的,看到这里终于有点眉目了。类似httpsevice,每次都将web请求传递下去,这样就能达到在最后一个service调用web请求并写响应信息回客户端。 也就是用户->入口->service1->service2->.....->serviceN->入口->用户。 不知道这样理解有问题不

    作者回复: Flower不需要通过入口 返回响应结果给用户,可以在任何一个或多个Service返回。

    2022-05-19
  • 学而不思则惘
    看下来我理解是一个countdownLatch的作用?

    作者回复: 并不是,flower可以做到用一个线程执行(看起来)并发执行数百个方法,并发处理数百个请求

    2022-03-31
    2
  • HappyHasson
    首先,对java不熟悉,所以这里面的有些概念不清楚,导致理解困难。 作者能不能画一张示例图,说明各个service怎么并行处理,然后综合结果给到请求端的。 我是看着看着被绕晕了,文中的概念名词很像

    作者回复: 可以参考github里的文档哈,https://github.com/zhihuili/flower。

    2022-03-21
  • 易企秀-郭彦超
    非http异步调用 怎么获取执行service的返回值,感觉flow原理和netty框架比较像

    作者回复: HttpService接口提供web参数,调用web.print()返回响应结果。

    2022-03-11
    3
  • 易企秀-郭彦超
    文中提到执行service方法有异步和同步 同步有返回值 是阻塞的,异步没有返回值 ,但是大多数情况下是需要返回值的 否则搞成生产者消费者不更简单吗

    作者回复: 方法的返回值和请求的返回值不是一回事,Service可以在方法内部调用web.print(), 直接返回请求的响应结果。 计算请求的响应结果,需要多个Service异步计算得到的,这些Service之间异步无阻塞,通常在流程的最后一个Service调用web.print(),返回请求处理结果。

    2022-03-11
  • test
    最佳线程数=[任务执行时间/(任务执行时间 - IO 等待时间)] * CPU 内核数
    2022-05-07
    1
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部