接上文高扩展的基于NIO的服务器架构

Reactor模式

如下图所示,将不同事件的检测分离开,当一种事件发生时一个事件处理器EventHandler将通知与该事件处理相对应的专用工作线程

采用这种架构,连接的通道不得不注册在一个Selector上。这样才能通过调用register方法使通道有效。

未完待续

...
SocketChannel channel = serverChannel.accept();
channel.configureBlocking(false); // register the connection
SelectionKey sk = channel.register(selector, SelectionKey.OP_READ);
...

为了达到检测新事件的目的,Selector类具备向已注册channel所要它们的就绪事件的能力。通过调用select方法,Selector类收集到了已注册channel的就绪事件。在至少这些就绪事件中的一个事件已经完成之前,select方法是处于阻塞状态下的。这种情况下,select方法返回截至最后一次调用select方法时已经对I/O操作做好准备的连接的数量值。

已选择的连接可以通过调用Selector类的selectedKey方法被检索到。selectedKey方法会返回SelectionKey对象的一个结果集,这些结果集保持了IO事件的状态和连接的Channel的引用。

Selector被Dispatcher控制 。Dispatcher是一个单线程的类。与Selector是组合关系。Dispatcher类负责检索事件以及调遣处理所消耗的调度事件的EventHandler。通过循环,Dispatcher类调用Selector类的select方法来等待新事件。当新的事件进来时,select方法返回,同时先关联的channel通过调用selectedKeys方法被收回。

...
while (isRunning) { // blocking call, to wait for new readiness events
int eventCount = selector.select(); // get the events
Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while(it.hasNext()) { SelectionKey key = it.next();
it.remove(); // readable event?
if (key.isValid() && key.isReadable()) { eventHandler.onReadableEvent(key.channel()); } // writable event?
if (key.isValid() && key.isWritable()) { key.interestOps(SelectionKey.OP_READ);
eventHandler.onWriteableEvent(key.channel()); } ... } ... }

像准备写或者准备读这样的事件,Dispatcher会调用EventHandler来处理。EventHandler负责解码请求数据,处理所需的服务活动,编码相应数据。由于工作线程为等待新的请求而而浪费事件,可扩展性和吞吐量的瓶颈只取决于系统资源如CPU或内存。因为需要线程切换好同步,响应时间上会逊色于传统的每个线程负责一个连接的架构。而这种事件驱动方式的架构是用来减少同步,优化线程管理,因此,这方面的开销忽略不计。

未完待续

高扩展的基于NIO的服务器架构(二)的更多相关文章

  1. 高扩展的基于NIO的服务器架构

    当你考虑写一个扩展性良好的基于Java的服务器时,相信你会毫不犹豫地使用Java的NIO包.为了确保你的服务器能够健壮.稳定地运行,你可能会花大量的时间阅读博客和教程来了解线程同步的NIO selec ...

  2. 基于NIO和BIO的两种服务器对比

    基于BIO的服务器,服务端可能要同时保持几百万个HTTP连接,而这些连接并不是每时每刻都在传输数据,所以这种情况不适合使用BIO的服务器:而且需要保证共享资源的同步与安全,这个实现起来相对复杂.这时候 ...

  3. [转]MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  4. MMORPG服务器架构

    MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...

  5. 高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)

    高吞吐高并发Java NIO服务的架构(NIO架构及应用之一) http://maoyidao.iteye.com/blog/1149015   Java NIO成功的应用在了各种分布式.即时通信和中 ...

  6. 基于事件的 NIO 多线程服务器--转载

    JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...

  7. 高性能高并发服务器架构设计探究——以flamigo服务器代码为例

    这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序. 所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时 ...

  8. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  9. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

随机推荐

  1. UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)

    前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a-&g ...

  2. How to delete a team project from Team Foundation Service (tfs.visualstudio.com)

    C:\project>tfsdeleteproject /collection:https://buckh-test2.visualstudio.com/DefaultCollection Te ...

  3. Java [Leetcode 101]Symmetric Tree

    题目描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...

  4. 【JS】限制两个或多个单选框最多只能选择一个

    $(function () { /*$("#checkbox1").click(function(){ if($(this).attr("checked") = ...

  5. 在android中进行视频的分割

    最近项目有个需求要对录制的视频进行分割,查了很多资料,看到ffmpeg可以对视频进行分割.上网找到别人基于android的开源ffmpeg,终于编译成功ffmpeg.so.但是要使用的话还要查ffmp ...

  6. wap版和pc版的旋转js

    <script type="text/javascript"> var evt = "onorientationchange" in window ...

  7. ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)

    我的个人博客站在使用百度富文本编辑器UEditor修改文章时,遇到了一些问题,(不知是bug,还是我没有配置好).但总算找到了解决方法,在此记录下来. 小站首页文章列表显示为(显示去除HTML标签后的 ...

  8. redis配置实例及redis.conf详细说明

    一.配置实例 1.redis修改持久化路径.日志路径.清缓存 redis修改持久化路径和日志路径 vim  redis.conf logfile /data/redis_cache/logs/redi ...

  9. HDU 5749 Colmerauer 单调队列+暴力贡献

    BestCoder Round #84   1003 分析:(先奉上zimpha巨官方题解) 感悟:看到题解单调队列,秒懂如何处理每个点的范围,但是题解的一句算贡献让我纠结半天 已知一个点的up,do ...

  10. Qt使用Cookies对网站操作之Get和POST

    1.添加QNetwork模块: a.Qt Creator中打开.pro文件添加QT+=Network; b.VS_Qt中项目属性中Qt Project Settings中Qmodules中勾选”QNe ...