反应式编程:阻塞与非阻塞 I/O 及 RxJava 核心概念解析
1. 阻塞与非阻塞 I/O 的性能考量
在编程中,反应式 - 函数式编程风格主要是为异步回调提供抽象,以实现更易于管理的组合。显然,并发执行无关的网络请求比顺序执行更有利于降低延迟,这也是采用异步编程和组合的原因。
那么,在执行 I/O 操作时,采用反应式方法(命令式或函数式)是否有效率上的考量呢?使用非阻塞 I/O 有什么好处,还是阻塞 I/O 线程来等待单个网络请求也可行?相关的性能测试表明,采用非阻塞 I/O 和事件循环比每个请求一个线程的阻塞 I/O 具有客观且可衡量的效率优势。
为了探究阻塞与非阻塞 I/O 的答案,进行了相关研究。在理论上,所有不同的方法(如纤程、事件循环、线程和 CSP)应该具有相同的性能(吞吐量和延迟),因为最终它们都使用相同的 CPU 资源。但在实践中,具体的实现由数据结构和算法组成,必须考虑硬件的实际情况,首先要理解硬件的工作原理,然后是操作系统和运行时的实现。
选择了像 Tomcat 和 Netty 这样的“真实世界”代码进行性能测试,因为它们与生产系统的选择直接相关。这两者在架构上的主要区别在于每个请求一个线程与事件循环。测试的相关细节和代码可以在 GitHub 的 Netflix - Skunkworks/WsPerfLab 找到,总结和演示文稿可以在 SpeakerDeck 上的“Applying Reactive Programming with RxJava”中找到。
测试的相关条件如下:
- 2015/2016 年左右典型 Linux 系统的行为。
- Java 8(OpenJDK 和 Oracle)。 <
超级会员免费看
订阅专栏 解锁全文
5万+

被折叠的 条评论
为什么被折叠?



