`
yand789
  • 浏览: 23160 次
社区版块
存档分类
最新评论

异步 I/O 模型大体上可以分为两种,反应式( Reactive )模型和前摄式( Proactive )模型

阅读更多
首先让我们对异步 I/O 做一些基本的了解。异步 I/O 模型大体上可以分为两种,反应式( Reactive )模型和前摄式( Proactive )模型:

传统的 select / epoll / kqueue 模型,以及 Java NIO 模型,都是典型的反应式模型,即应用代码对 I/O 描述符进行注册,然后等待 I/O 事件。当某个或某些 I/O 描述符所对应的 I/O 设备上产生 I/O 事件(可读、可写、异常等)时,系统将发出通知,于是应用便有机会进行 I/O 操作并避免阻塞。由于在反应式模型中应用代码需要根据相应的事件类型采取不同的动作,最常见的结构便是嵌套的 if {...} else {...}  或 switch ,并常常需要结合状态机来完成复杂的逻辑。

前摄式模型则恰恰相反。在前摄式模型中,应用代码主动地投递异步操作而不管 I/O 设备当前是否可读或可写。投递的异步 I/O 操作被系统接管,应用代码也并不阻塞在该操作上,而是指定一个回调函数并继续自己的应用逻辑。当该异步操作完成时,系统将发起通知并调用应用代码指定的回调函数。在前摄式模型中,程序逻辑由各个回调函数串联起来:异步操作 A 的回调发起异步操作 B ,B 的回调再发起异步操作 C ,以此往复。

Reactor 和 Proactor 同为事件驱动 I/O 模型,其本质区别在于事件触发时机: Reactor 在 I/O 设备就绪,即可以立即执行 I/O 调用而无需阻塞时触发,只有这时才可以放心大胆的执行 I/O 调用;而 Proactor 则允许在任意时刻发起 I/O 调用请求,并在 I/O 调用完成时触发事件。

Proactor 可以直接利用系统提供的 aio 、 IOCP 等异步 I/O 机制实现。不过鉴于一时之间各种平台上 aio 接口实现的兼容性、功能、性能等方面的表现都还比较不靠谱,常见平台里还是 Win32 IOCP 对 Proactor 的原生支持最好。当系统不提供原生的异步 I/O 机制时,也可以使用 Reactor 模拟实现。相关内容可参见这篇文章。 MINA 正是借由 Java NIO 的 Reactor 实现的模拟 Proactor 模型。 Boost.Asio 的 Proactor 内核在非 NT Win32 平台上也是利用select() / kqueue() / epoll 等 Reactor 模拟实现的。

Reactor 按照事件触发方式又可分为 level-triggered (LT) 和 edge-triggered (ET) 两种,其区别详见 epoll 的 man page 。传统的 select() / poll() 都属于 LT Reactor ; kqueue() 则是 ET Reactor ; epoll 是个两面派, LT/ET 语义通吃。

前摄式模型相较于反射式模型往往更加难以编程。然而在具有原生异步 I/O 支持的操作系统中(例如支持 IO Completion Port 的 Win32 系统),采用前摄式模型往往可以取得比反应式模型更佳的效率。在没有原生异步 I/O 支持的系统中,也可以使用传统的反应式 API 对前摄式模型予以模拟。在现代的软硬件系统中,使用 epoll 和 kqueue 的前摄式模型实现同样可以轻松解决 C10K 问题。前摄式模型的一个显著优势是在实现复杂逻辑的时候不需要借助于状态机。因为状态机已经隐含在由回调串联起来的异步操作链当中了。如果上述内容难以理解,可以参考 Boost.Asio,这是一个相当优秀的跨平台 C++ 前摄式 I/O 模型实现。
分享到:
评论

相关推荐

    ApacheMina典型例子分析参考.pdf

    在Mina中,有两种主要的异步I/O模型:反应式(Reactive)和前摄式(Proactive)模型。反应式模型,如Java NIO,是基于事件的,应用程序注册I/O描述符并等待事件发生,当事件触发时,应用可以进行非阻塞的I/O操作。...

    Reactive programming反应式编程介绍

    响应式编程是一种编程范式,它专注于数据流和依赖传播,而非命令式编程中的步骤执行。在响应式编程中,程序被建模为数据的流动,这种数据可以是事件、消息或者时间序列,它们在系统中传递并影响其他组件。这种编程...

    reactive-grpc,将反应式编程与GRPC Java集成。.zip

    1. **反应式编程**:一种编程模型,专注于数据流和依赖传播,常用于异步编程,可提高系统的可扩展性和资源利用率。 2. **gRPC**:基于 HTTP/2 和 Protocol Buffers 的高性能 RPC 框架,支持多种语言,提供强类型、...

    reactive-audit,审计工具旨在为在项目实现中使用反应式架构提供帮助。.zip

    反应式架构是一种设计模式,它强调系统的响应能力、弹性、容错性和可伸缩性,通常与非阻塞I/O和事件驱动编程相关联。在现代Web应用程序和微服务环境中,反应式架构变得越来越重要,因为它可以有效地处理高并发和实时...

    Learning.Reactive.Programming.With.Java.8

    Java的NIO(非阻塞I/O)和AIO(异步I/O)为反应式编程提供了基础。通过非阻塞I/O,系统可以同时处理多个请求,提高资源利用率和系统性能。 5. **背压机制**:在高并发环境中,数据生产速度可能远超消费速度,背压...

    reactive风格的微服务框架-xian.zip

    Reactive编程是一种编程范式,强调数据流和依赖传播,使得系统能够对变化做出反应,通常用于处理异步数据流。这种风格的编程特别适合于资源受限的环境,如多核处理器、网络I/O和大规模分布式系统,因为它们可以高效...

    反应式微服务框架ServiceComb设计思想.pptx

    ServiceComb通过采用非阻塞I/O和反应式编程,遵循Reactor黄金法则,确保Event Loop的高效运行,从而实现高TPS(每秒事务数)和低延迟。\n\n总之,ServiceComb通过引入反应式微服务架构,结合Vert.x的事件驱动模型,...

    java响应式编程(building reactive microservices in java)

    这种编程模型强调非阻塞I/O和异步处理,通过事件驱动和回调机制来提高系统的可伸缩性和响应性。 2. Reactive Manifesto: 响应式系统遵循Reactive Manifesto的四大原则:反应性、弹性、容错性和消息驱动。这些原则...

    Reactive Streams in Java

    与传统的基于线程和阻塞调用的模型相比,反应式编程模型通常能够更好地处理I/O密集型工作负载,因为它能够在I/O操作发生时释放线程,避免了空闲等待。 尽管响应式编程提供了许多优势,但它也有一些挑战。比如,对于...

    RxPM,android中表示模型模式的反应式实现.zip

    反应式编程是一种编程范式,它将数据流和变化传播作为核心概念,使程序能够更优雅地处理异步数据和事件。RxPM 项目的目标是帮助开发者更高效、更简洁地管理 Android 应用中的业务逻辑和数据状态。 在 Android 开发...

    reactive-mybatis-support-examples-master.zip

    1. **非阻塞I/O**:通过使用Reactor或RxJava等反应式库,Reactive MyBatis可以在数据库操作中实现非阻塞I/O,显著提高系统吞吐量。 2. **流式API**:提供了一套流式API,使得数据库查询结果可以像Java 8中的Stream...

    反应式(Reactive)IM 服务端,快速搭建高性能、高可用的 IM 服务.zip

    反应式编程是一种编程模型,强调数据流和变化传播,它使得系统能够对变化做出响应,并在资源有限的情况下高效运行。这种编程方式在处理高并发、实时性要求高的IM服务中非常有效,因为它能够实现非阻塞I/O,提高系统...

    TUP第七期赵劼:微软异步编程模型的演变 演讲PPT

    F#是一种函数式编程语言,它支持基于任务和操作的异步编程模型,使得编写异步代码变得更加简洁和直观。 ##### .NET 4.0 / Reactive Framework .NET 4.0引入了Reactive Extensions (Rx),这是一种用于构建和处理...

    reactive-微服务的demo-Java后台

    Java平台上的Reactive编程则是微服务架构的一种扩展,它允许我们构建高度响应式、弹性、容错且可伸缩的应用程序。 标题“reactive-微服务的demo-Java后台”暗示我们将探讨如何使用Java来实现响应式的微服务示例。...

    reactor-core,jvm的无阻塞反应式基础.zip

    反应式编程则是这种思想的一种具体实现,它强调数据流和变化的传播,通过异步非阻塞的方式处理事件,使得系统更加弹性、容错和高效。 **1. 反应式扩展(Reactive Streams)** React Core实现了反应式扩展规范,这...

    Manning.Reactive.Web.Applications.2016.6.pdf

    标题《Manning.Reactive.Web.Applications.2016.6.pdf》和描述部分的文本信息指出这是一本关于反应式Web应用程序的书,涵盖的技术框架包括Play、Akka和Reactive Streams。标签“Reactive scala Web”表明书中重点...

    Hands-On Reactive Programming in Spring 5

    反应式编程是一种编程范式,强调在处理异步数据流时的可伸缩性和响应性,这在当今高并发、大数据量的环境中尤为重要。Spring 5引入了对反应式编程的全面支持,通过Spring Framework和Spring Boot,开发者可以构建...

    Reactive4JavaFlow,基于Java9FlowAPI和第四代ReactiveX风格架构的反应式编程库。.zip

    总之,Reactive4JavaFlow是Java开发人员在构建反应式应用程序时的一个强大工具,它利用Java 9的Flow API和ReactiveX的最佳实践,提供了一种高效、简洁的方式来处理异步数据流,适应现代高性能软件开发的需求。...

Global site tag (gtag.js) - Google Analytics