在第一部分中,我们讲述了在单个服务下扩展一个单线程应用的请求处理数量所面临的问题。
在这篇文章中,我们将关注CPU使用率最大化的一个可选择的解决方案。
以下来自文章一的图,表明了应用需要通过请求来使用CPU,而且还必须在两次请求之间等待。
加入我们把处理请求看成一个事件,并且把这些时间进行排队然后在一个线程中执行,那么我们可以肯定CPU降一直被占用,从而也使CPU使用率达到最大,还避免了不必要的上下文切换。
考虑到由于没有任何IO操作的事件可以在处理块中被非顺序性或者异步执行,所以可以把代码分割成独立的可执行快(事件),这样其他的请求事件可以再它们之间穿插执行。
Event Loop
Event Loop是在一个程序中的一个可以通过单个线程来等待事件、执行事件的循环程序。想要了解更多的话可以通过搜索“Event Loop”来了解。
Unix文件描述符
由于unix认为所有东西都是文件的原则,文件描述符在文件读写、网络通信、设备通讯和进程间通信时用来检测事件的发生。而系统调用通过“epoll”、“pselect”可以在不阻塞应用的前提下来检测文件描述符的状态变化。
下图展示了一个简单的event loop,其中每个循环包括四个阶段:
1.检查是否有新的事件创建(如一个请求的到来或者一个回调事件的发生)以及为队列中已经存在的任务添加新的事件
2.从队列中选择事件
3.执行事件
4.创建回调事件(如响应结果时的数据库查询和网络请求的回调)。回调事件是通过epoll或者pselect模式来处理。
以上描述的就是堆反应模式的一个简单例子。
C10K问题
曾经,反应堆模式(reactor pattern)在C10问题和C10K问题解决办法中对非阻塞模式的使用有着非常突出的作用。
反应堆模式(reactor pattern)的缺点
1.基于异步事件机制使得对整个代码及其结构的理解边的非常困难。这个希望一些库可以起到帮助作用。
2.由于堆栈将从回调开始而不是从请求一开始就建立,因此,调试也变的更加困难。
这些缺点可以通过使用fiber来缓和(例如使用ruby fiber,node fiber),这些将在以后的文章中讲到。
1.本文由程序员学架构翻译,由mathew同学校审;仅用于交流学习使用。
2.本文译自Venkatesh CM在Reactor Pattern Part 2 - Applications with Non-Blocking I/O的博客。
3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )
4.更多文章请扫码:
相关推荐
反应堆模式是一种常见的事件驱动设计模式,它通过一个事件循环来监控多个事件源。当事件发生时,反应堆会调用相应的回调函数进行处理。在这个服务器中,libevent就是实现反应堆模式的关键组件。 4. **线程池**: ...
- 异步I/O的一种实现方式,区别于反应堆模式。 - 应用程序不直接对I/O请求进行处理,而是提交一个描述了I/O操作的异步操作给操作系统,由操作系统来完成实际的I/O操作,然后通过回调、事件通知或者其它方式通知...
9. **异步处理**:通过异步非阻塞IO(如NIO)和反应式编程,可以在处理高并发请求时,减少等待时间,提高系统吞吐量。 10. **代码重构**:定期进行代码审查和重构,消除冗余代码,减少不必要的计算和资源消耗,保持...
- **传统IO与NIO的区别**:阻塞与非阻塞,缓冲区,选择器的使用。 9. **网络协议**: - **TCP/IP协议栈**:了解TCP连接的三次握手和四次挥手过程。 10. **数据结构与算法**: - **常见数据结构**:数组、链表、...
- **多路复用**:了解NIO(非阻塞I/O)和Java NIO.2框架,如Selector和Channel。 8. **设计模式** - **单例模式**:了解多种实现方式,如饿汉式、懒汉式、双重检查锁定等。 - **工厂模式**:理解简单工厂、工厂...
5. **IO流**:理解输入/输出流的概念,熟悉FileInputStream、FileOutputStream、BufferedReader、PrintWriter等类的用法,以及NIO(非阻塞I/O)的新特性。 6. **多线程**:探讨Java中的线程同步机制,如...
9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞connect 9.6 IO复用的高级应用二:...
2. NIO(非阻塞I/O):Java 1.4引入的新I/O模型,提高了I/O操作的性能和效率。 七、网络编程 Java提供了Socket编程接口,可以用于创建客户端和服务器应用,理解TCP/IP协议和HTTP协议对于网络编程至关重要。 八、...
7. **IO流**:掌握`InputStream`、`OutputStream`、`Reader`、`Writer`的基本用法,理解NIO(非阻塞I/O)和AIO(异步I/O)的优势,以及`Files`和`Path`类的使用。 8. **网络编程**:理解Socket编程,包括TCP和UDP...
5. **05day反应堆线程池**: 反应堆(Reactor)模式是并发编程的一种设计模式,常用于处理I/O事件。线程池则是为了提高系统效率,避免频繁创建和销毁线程带来的开销。这部分可能讲述如何结合二者构建高效的网络服务...
NIO(非阻塞I/O)是Java 1.4引入的新特性,提高了处理高并发I/O的效率。 6. **多线程**:Java内置对多线程的支持,可以创建Thread对象或实现Runnable接口来实现并发执行。同步机制(如synchronized关键字、wait()、...
5. **IO/NIO**:流的分类、字符编码、缓冲区、过滤器,以及Java NIO(非阻塞I/O)的优势和使用。 6. **网络编程**:TCP/UDP协议,Socket编程,HTTP/HTTPS协议的理解及其应用。 7. **设计模式**:单例、工厂、抽象...
5. **IO/NIO**:Java的输入输出(IO)和非阻塞I/O(NIO)库提供了处理文件、网络数据传输的能力。 6. **多线程**:Java提供了内置的多线程支持,理解线程的创建、同步、通信对于构建并发程序至关重要。 7. **JVM**...
那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复...
那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复...