当你考虑写一个扩展性良好的基于Java的服务器时,相信你会毫不犹豫地使用Java的NIO包。为了确保你的服务器能够健壮、稳定地运行,你可能会花大量的时间阅读博客和教程来了解线程同步的NIO selector 类和处理常见的陷阱上。本篇文章介绍了一个基本的、面向连接的基于NIO的服务器架构。在介绍之前,让我们先来看一下该它首选的线程模型和它的基本组件。

线程架构模型
最先想到的实现多线程服务器程序的方法是每个线程负责一个连接。这是传统的,JDK1.4版本以前的解决方案,因为老版本的JDK缺少非阻塞支持。这种方式为每一个连接创建一个工作线程。由创建的工作线程等待新传入的数据,处理请求,返回相应数据,并在此调用阻塞套接字的读数据的相关方法。

public class Server {

	private ExecutorService executors = Executors.newFixedThreadPool(10);

	private boolean isRunning = true;

	public static void main(string[] args) {

		new server().launch(Integer.parseInt(args[0]));

	}

	public void launch(int port) {

		ServerSocket sso = new ServerSocket(port);

		while(isRunning) {

			Socket s = sso.accept();
executors.execute(new Worker(s)); } } private class Worker implements Runnable { private LineNumberReader in = null;
... Worker(Socket s) { in = new LineNumberReader(new InputStreamReader(...));
out = ... } public void run() { while(isRunning) { try { // blocking read of a request (line)
String request = in.readLine(); // processing the request
...
out.write(response);
out.flush(); } catch(Exception e) { ... } } in.close();
...
} } }

客户端的并发的连接和工作线程之间是一一对应的,每个连接所关联的线程等待在服务器端的响应。这样每个客户端的连接的响应时间都比较短。但是当并发量较大时,数百个甚至上千个线程浪费了大量的堆栈空间,系统效率大大下降。

如果服务器端需要处理高并发的、持续时间长的连接请求时,传统的一个连接对应一个工作线程的方式显然是行不通的。线程与事件对应的模型是一种有效的方式,工作线程独立于连接,只会用来处理特定的事件。例如,如果一个接收到的数据事件发生时,一个工作线程将会从线程池中拿出来处理该事件,处理完后,工作线程返回线程池。这种线程与事件对应的模型执行socketI/O的非阻塞方式。这种由事件驱动的I/O系统设计被称为Reactor模式

见下文高扩展的基于NIO的服务器架构(二)

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

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

    接上文高扩展的基于NIO的服务器架构 Reactor模式 如下图所示,将不同事件的检测分离开,当一种事件发生时一个事件处理器EventHandler将通知与该事件处理相对应的专用工作线程 采用这种架构 ...

  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 11609 (计数 公式推导) Teams

    n个人里选k个人有C(n, k)中方法,再从里面选一人当队长,有k中方法. 所以答案就是 第一步的变形只要按照组合数公式展开把n提出来即可. #include <cstdio> typed ...

  2. UVa 10892 (GCD) LCM Cardinality

    我一直相信这道题有十分巧妙的解法的,去搜了好多题解发现有的太过玄妙不能领会. 最简单的就是枚举n的所有约数,然后二重循环找lcm(a, b) = n的个数 #include <cstdio> ...

  3. ListView 使用

    1. 不使用xml 文件 动态创建 Listview 并且绑定 ArrayList ListView listView = new ListView(this); listView.setAdapte ...

  4. Builder模式在Java中的应用(转)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  5. WordPress数据库研究 (转)

    该系列文章将会详细介绍WordPress数据总体的设计思路.详细介绍WordPress10个数据表的设计.并对WordPress系统中涉及的用户信息.分类信息.链接信息.文章信息.文章评论信息.基本设 ...

  6. noip2001提高组题解

    今天继续感动滚粗.第一次提交170分,不能多说. 第一题:一元三次方程 明明是寒假讲分治的时候做过的题居然还是WA而且只拿了60分,说明知识掌握实在不够牢固. 寒假做的是保留4位小数,原题只保留2位, ...

  7. operator.itemgetter的用法【转】

    operator.itemgetter函数 operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [,, ...

  8. 图文详解YUV420数据格式

    YUV格式有两大类:planar和packed.对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y,U ...

  9. NPlot开源画图类

    一.net下的图表控件­­­NPlot的基本用法 NPlot的基本用法 图表控件一直是很难找的,特别是免费又强大的.NPlot是一款非常难得的.Net平台下的图表控件,能做各种曲线图,柱状图,饼图,散 ...

  10. JAVA深复制(深克隆)与浅复制(浅克隆)

    1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. 1. ...