反应式架构

栏目: 后端 · 发布时间: 5年前

内容简介:异步分为不同的层次,有代码上的、框架上的、架构上的不同层面的异步反应式思想 也分为不同的层次,rxjava1——概念

简介 (未完成)

异步分为不同的层次,有代码上的、框架上的、架构上的不同层面的异步

反应式思想 也分为不同的层次,rxjava1——概念

全面异步化:淘宝反应式架构升级探索

反应式架构与一般架构相比,其反应体现在:

  1. 对用户有反应,对用户有反应我们才说响应,一般我们说的响应,基本上都说得针对跟用户来交互。
  2. 对输入有反应,响应系统的输入,也可以叫做消息驱动。
  3. 要对失败有反应,应用失败了系统不能无动于衷,等着它挂掉,要有反应。
  4. 要对容量和压力变化有所反应,比如说淘宝的秒杀,系统需要反应来保证对用户的响应性,再如那个当流量降下来,将系统缩容,可以节约成本,这也是一种反应。

要做到反应式,需要做到三点:

  1. 适应性,也就是发生失败能恢复回来,无论是系统、网络、代码出现了问题都能恢复。
  2. 弹性,这点主要是应对流量的变化,弹性的前提是做到可伸缩性 Scalability,从软件设计上,要做到去中心化;同时,在运行时,要感知节点当前的系统负载,将压力往上游进行反馈,做到系统可以感知链路级别的节点压力
  3. 消息驱动,有了消息驱动才能比较好的做到上面两个点。在反应式架构里,以前这点叫做事件驱动,后来改为消息驱动,消息驱动强调无阻塞、无 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. 反应式编程 对异步代码很友好


以上所述就是小编给大家介绍的《反应式架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图形程序开发人员指南

图形程序开发人员指南

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......一起来看看 《图形程序开发人员指南》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具