内容简介:异步分为不同的层次,有代码上的、框架上的、架构上的不同层面的异步反应式思想 也分为不同的层次,rxjava1——概念
简介 (未完成)
异步分为不同的层次,有代码上的、框架上的、架构上的不同层面的异步
反应式思想 也分为不同的层次,rxjava1——概念
反应式架构与一般架构相比,其反应体现在:
- 对用户有反应,对用户有反应我们才说响应,一般我们说的响应,基本上都说得针对跟用户来交互。
- 对输入有反应,响应系统的输入,也可以叫做消息驱动。
- 要对失败有反应,应用失败了系统不能无动于衷,等着它挂掉,要有反应。
- 要对容量和压力变化有所反应,比如说淘宝的秒杀,系统需要反应来保证对用户的响应性,再如那个当流量降下来,将系统缩容,可以节约成本,这也是一种反应。
要做到反应式,需要做到三点:
- 适应性,也就是发生失败能恢复回来,无论是系统、网络、代码出现了问题都能恢复。
- 弹性,这点主要是应对流量的变化,弹性的前提是做到可伸缩性 Scalability,从软件设计上,要做到去中心化;同时,在运行时,要感知节点当前的系统负载,将压力往上游进行反馈,做到系统可以感知链路级别的节点压力
- 消息驱动,有了消息驱动才能比较好的做到上面两个点。在反应式架构里,以前这点叫做事件驱动,后来改为消息驱动,消息驱动强调无阻塞、无 callback,所以不会有线程挂在那里,不会有持续的资源消耗。同时,事件驱动或消息驱动都是异步化,而 异步化会将操作系统中的队列情况显式地提升到了应用层,使得应用层可以显式根据队列的情况来进行压力负载的感知 (PS,常规的同步操作,会让os 线程让出cpu,在os thread struct list 中等着被调度。异步之后,线程都是满负荷在跑)
PS:从上图学到的一点是,在反应式架构下, app 并不是直接和组合业务服务交互的,有了网关一层的包装,http 响应本质就是 用tcp连接 给网关写返回值数据而已。我们想象一下一个中间rpc 服务的逻辑
1. 串联rpc 框架,上游请求序列转换为一个输入参数流,一次调用(比如查询product)视为“进来一个productId” 2. 对输入数据进行转换,可能涉及到其它rpc 3. 等拿到结果了,写回响应
其实有点类似 mapreduce, map和reduce 归你写,但什么时候在哪里哪个线程跑map/reduce 你就说了不算了。
反应式架构中的核心概念是“流”,流就是面向数据的顺序串行执行的一系列操作组合,它同传统的编程相比,将业务逻辑导致数据改变,变成了操作改变数据,反过来影响业务逻辑的改变。面向流编程就是面向数据编程。PS:没懂
整个方案对业务架构的升级主要包括编程框架、中间件,以及业务方的升级。中间件的升级,包括服务框架(RPC)、网关、缓存、消息(MQ)、DB(JDBC)、限流组件、分布式跟踪系统、移动端 Rx 框架。这其中值得注意的包括,对服务框架的升级,流式实现将在 Dubbo 3 中放出;DB 中的异步集成使用 Ali JVM 协程或用线程池实现;移动端为了支撑已有的 iOS 应用,淘宝开发了 AliRxObjc 并即将开源。
以分支逻辑的替换为突破口来理解反应式编程
传递的命令式编程范式以控制流为核心,通过顺序、分支和循环三种控制结构来完成不同的行为。
顺序和循环 使用rxjava 替换起来比较简单,难就难在 分支/ifelse 的替换。参见 Conditional Logic and RX 值得读三遍
Conditional logic in RX style programming is a big hurdle for new users. If you’re coming from an imperative background there is a learning curve. Once you get the hang of it though, you can create powerful but simple applications that would be almost to difficult the old way.
对数据组中奇数和偶数进行不同的输出:
public class EvenOrOdd { public static void main(String... args) { Flux.fromIterable(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) .map(EvenOrOdd::check) .doOnNext(System.out::println) .blockLast(); } private static String check(int i) { if (i % 2 == 0) { return i + " is even"; } else { return i + " is odd"; } }
那如果奇数和偶数场景下 调用不同的rpc呢? 那就是将 数字map 为future。不管符不符合condition,都是一种输出,将分支判断转换为 map映射。那如果不符合条件没输出呢?用filter 操作即可。
Rx-style programming really shines with asynchronous code. 反应式编程 对异步代码很友好
以上所述就是小编给大家介绍的《反应式架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 全面异步化:淘宝反应式架构升级探索
- 反应式编程概览(中文版)
- 反应式编程 RxJava 设计原理解析
- 从反应式角度看Apache Kafka
- 反应式编程实战 - RxJava 2.x 基本模式
- 使用Spring实现反应式事务(Reactive Transactions)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
图形程序开发人员指南
Michael Abrash / 前导工作室 / 机械工业出版社 / 1998 / 128
Michael Abrash's classic Graphics Programming Black Book is a compilation of Michael's previous writings on assembly language and graphics programming (including from his "Graphics Programming" column......一起来看看 《图形程序开发人员指南》 这本书的介绍吧!