异步分为不同的层次,有代码上的、框架上的、架构上的不同层面的异步
反应式思想 也分为不同的层次,rxjava1——概念
全面异步化:淘宝反应式架构升级探索
反应式架构与一般架构相比,其反应体现在:
要做到反应式,需要做到三点:
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. 反应式编程 对异步代码很友好