11 | 反应式编程框架设计:如何使方法调用无阻塞等待?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了反应式编程框架设计的关键特性和实现原理,旨在帮助读者快速了解该框架的概览。文章首先强调了反应式编程的重要性,以及反应式系统应该具备的四个特质:即时响应、回弹性、弹性和消息驱动。接着介绍了一种名为“Flower”的纯消息驱动、完全异步、支持命令式编程的反应式编程框架,以及其实现原理和核心元素。在需求分析部分,文章阐述了传统阻塞式编程模型的局限性,以及Flower框架应该满足的典型Web应用的线程特性。在概要设计和详细设计部分,文章详细介绍了Flower框架的实现原理,包括利用Java Web容器的异步特性、异步的数据库驱动和网络通信,以及基于Akka的Actor模型实现异步无阻塞调用。最后,文章强调了架构师应该具备卓越的代码能力,开发自己的编程框架以及约定的编程规范,以保持自己的技术影响。总的来说,本文对于想要了解反应式编程框架的读者具有很高的参考价值,尤其适合对并发处理需求高、需要快速、及时响应的场景。
《李智慧 · 高并发架构实战课》,新⼈⾸单¥59
全部留言(14)
- 最新
- 精选
- 👽因为异步,无阻塞。我觉得其实最主要解决的是io访问和网络请求。其基本原理是,CPU的运算速度远远高于IO访问(比如磁盘访问,外设访问),更远高于网络请求(局域网内的数据库,或者微服务下的服务间通信) 传统串行化,就好像,我要组装一台电脑,我拿到图纸以后,图纸第一步是组装机箱,我订购了一个机箱3天到货,然后机箱里要放主板,我又定了一个主板2天到货,主板上要放cpu,我又定了一个CPU半个月到货。。。最终一台电脑组装好,两个月过去了。组装时间取决于所有产品订购到货的总时间。 我理解的响应式就是,我收到图纸,发现图纸要CPU,主板,内存,硬盘,机箱。。。我全部发起订购。然后都开始送货,等货全到齐了之后,开始组装。这个时候,组装时间取决于最长到货的那个配件。所以大幅提升了性能。 反过来说,如果你本身不需要io访问,网络调用之类的操作。响应式对于性能的提升其实是很有限的。 应用场景的话,我觉得可以有金融领域的风控。因为风控其实是一整串校验,而且这一串校验服务很可能是独立的。甚至部分服务是由不同的供应商提供的。如果这种业务场景,走串行化之行,执行效率肯定是不可接受的。使用响应式,可以很大程度缓解这个问题。只需要保证,我的每一个风控校验的服务,或者提供商,响应时间控制在一个范围内,就能保证整个请求的执行时间不会太离谱。
作者回复: 很赞,确实,Akka的很多应用案例都出自金融行业。
2022-03-15210 - ABC老师有推荐的反应式框架吗?最近想学习一下。
作者回复: Akka
2022-03-304 - javaadu我是做风控策略引擎的,在策略引擎中,同一个事件过来,需要并行跑很多模型、特征,然后统一决策。这些模型和特征都是外部的系统,对于io并发的要求很高,使用响应式编程有助于减少阻塞环节。 其他的场景,暂时没想到,看看其他同学的回答
作者回复: 赞,学习了~
2022-03-263 - 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-113 - 雪碧心拔凉妙啊,一直没明白响应式怎么响应信息给客户端的,看到这里终于有点眉目了。类似httpsevice,每次都将web请求传递下去,这样就能达到在最后一个service调用web请求并写响应信息回客户端。 也就是用户->入口->service1->service2->.....->serviceN->入口->用户。 不知道这样理解有问题不
作者回复: Flower不需要通过入口 返回响应结果给用户,可以在任何一个或多个Service返回。
2022-05-19 - 学而不思则惘看下来我理解是一个countdownLatch的作用?
作者回复: 并不是,flower可以做到用一个线程执行(看起来)并发执行数百个方法,并发处理数百个请求
2022-03-312 - HappyHasson首先,对java不熟悉,所以这里面的有些概念不清楚,导致理解困难。 作者能不能画一张示例图,说明各个service怎么并行处理,然后综合结果给到请求端的。 我是看着看着被绕晕了,文中的概念名词很像
作者回复: 可以参考github里的文档哈,https://github.com/zhihuili/flower。
2022-03-21 - 易企秀-郭彦超非http异步调用 怎么获取执行service的返回值,感觉flow原理和netty框架比较像
作者回复: HttpService接口提供web参数,调用web.print()返回响应结果。
2022-03-113 - 易企秀-郭彦超文中提到执行service方法有异步和同步 同步有返回值 是阻塞的,异步没有返回值 ,但是大多数情况下是需要返回值的 否则搞成生产者消费者不更简单吗
作者回复: 方法的返回值和请求的返回值不是一回事,Service可以在方法内部调用web.print(), 直接返回请求的响应结果。 计算请求的响应结果,需要多个Service异步计算得到的,这些Service之间异步无阻塞,通常在流程的最后一个Service调用web.print(),返回请求处理结果。
2022-03-11 - test最佳线程数=[任务执行时间/(任务执行时间 - IO 等待时间)] * CPU 内核数2022-05-071