﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-快乐地耕耘着-文章分类-设计收集站</title><link>http://www.blogjava.net/sunnyskyjava/category/11181.html</link><description>上帝说要有光</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:41:03 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:41:03 GMT</pubDate><ttl>60</ttl><item><title>通用网络服务器的设计思路</title><link>http://www.blogjava.net/sunnyskyjava/articles/46396.html</link><dc:creator>勤天</dc:creator><author>勤天</author><pubDate>Tue, 16 May 2006 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyskyjava/articles/46396.html</guid><wfw:comment>http://www.blogjava.net/sunnyskyjava/comments/46396.html</wfw:comment><comments>http://www.blogjava.net/sunnyskyjava/articles/46396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyskyjava/comments/commentRss/46396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyskyjava/services/trackbacks/46396.html</trackback:ping><description><![CDATA[
		<p>1. 设计目标：<br />  高性能，高扩展性，的网络服务器的底层框架。可能有人会问C++有了ACE库，而且现在ACE也已经移植到了Java上去了还需要你这个框架吗？我想说的是我的这个框架是基于ACE之上的。对于某种网络服务器实现的抽象。ACE提供的是将功能与系统底层具体实现的隔离的infrastructure 级别的框架。而我的这个服务器框架提供的是一种半成品的网络服务器。只有实现某些状态接口，回调接口就是一个完整的网络服务器. <br /><br />2.原始动机：<br /> 最开始写服务器端的程序之时处理用户并发就是采用多线程的方式，每个用户联接用一个线程维护。对于小并发量，小负荷的服务器而言这样设计最为简单直观。可是对于大并发处理量的服务器而言派生大量的线程单单线程间的context切换的处理量就已是相当惊人了。更何况OS线程数量的上限以及线程本身消耗的OS内核资源都使得线程模式的服务器不具备良好的扩展性。因此我们会用select的网络事件的机制来用一个线程来为多个并发用户服务。这样做带来的开发上的区别不仅仅是转换API那么简单。因为换用了采用网络事件来驱动程序，一个用户的处理不再可以一条线由头处理到尾了。收到读事件后还需要当前用户的状态才知道下一步的处理。程序逻辑越复杂状态也越多。如何在一个网络服务器框架中将这些复杂的状态迁移机制封装起来。用一些简单的描述文件+接口实现就可以组装出一台网络服务器这就是我的设计要解决的问题。目前这个原型是用java NIO来实现的。计划C++版本就用ACE作底层<br /><br />3.目前状态：<br /> 对于java NIO的探索阶段已经完成，也构造了基本的原型。现在的新的设计思路就是并发多个selector线程，Socket Channel 读操作以及一些不耗时的状态效验的操作都在selector线程中完成。其余与IO无关的耗时的逻辑都由另外一个线程池中的线程来完成.</p>
<img src ="http://www.blogjava.net/sunnyskyjava/aggbug/46396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyskyjava/" target="_blank">勤天</a> 2006-05-16 14:20 <a href="http://www.blogjava.net/sunnyskyjava/articles/46396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>