免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iunknown

SPServer: 一个基于线程池(包括HAHS和LF)的开源服务器框架 [复制链接]

论坛徽章:
0
发表于 2007-07-10 13:04 |显示全部楼层
原帖由 iunknown 于 2007-7-6 19:41 发表

ACE 基于 OO 的接口

  1. class Event_Handler {
  2. pupblic:
  3.     virtual void handle_input( HANDLE handle ) = 0;
  4.     virtual void handle_output( HANDLE handle ) = 0;
  5.     virtual void handle_timeout( const Time_Value & ) = 0;
  6.     virtual void handle_close( HANDLE handle, Event_Type et ) = 0;
  7. };
复制代码


看了一下代码,SPServer 实现的不是类似 Event_Handler 这样的接口,而是

  1. class SP_Handler {
  2. public:
  3.         virtual ~SP_Handler();

  4.         // return -1 : terminate session, 0 : continue
  5.         virtual int start( SP_Request * request, SP_Response * response ) = 0;

  6.         // return -1 : terminate session, 0 : continue
  7.         virtual int handle( SP_Request * request, SP_Response * response ) = 0;

  8.         virtual void error( SP_Response * response ) = 0;

  9.         virtual void timeout( SP_Response * response ) = 0;

  10.         virtual void close() = 0;
  11. };
复制代码


这个接口更类似 proactor ,而不是 reactor 。接口上体现的不是 event ,而是 result 。

论坛徽章:
0
发表于 2007-07-10 19:39 |显示全部楼层
原帖由 queue 于 2007-7-10 13:04 发表


这个接口更类似 proactor ,而不是 reactor 。接口上体现的不是 event ,而是 result 。


不错,SPServer 其实更像 proactor 。之前在这里也讨论得到类似的结果

http://iunknown.javaeye.com/blog/post/320133

呵呵,这两天重新看 POSA2 关于 reactor/proactor 的论述,理解的更多了一点。对于 spserver ,我也有这种看法。

reactor 和 proactor 的主要区别:
proactor 是由于异步操作的完成事件触发 handler 的执行,reactor 是由于产生了可以进行非阻塞操作的事件触发 handler 的执行。

libevent 可以说是一个 reactor 的实现。这一点通过对比 reactor 的 Event_Handler 和 libevent 的 callback ,可以和清楚地看到是非常类似的。两者在接口上,体现的是 IO 句柄是否可读或可写。

spserver 也就是相当于基于 libevent 的 reactor 封装了一个 proactor 出来。也是从对比 proactor 和的 Complete_Handler 和 SP_Handler 可以看出来。两者在接口上,体现的是异步操作的结果:proactor 是 Async_Result ,spserver 是 SP_Request->getMsgDecoder() 。


找到了一个用模拟 async IO 来实现 Proactor 的文章。
Comparing Two High-Performance I/O Design Patterns
ACE  自带的 proactor 只能在支持异步 IO 的操作系统上才能使用,比如 windows 有 overlapped ,部分 unix 平台有  aio 。
这篇文章描述了如果使用 event-driven 来模拟异步 IO ,从而实现 proactor 模式。

在开发 SPServer 之前也曾看到过这篇文章,不过当时没留意,也没完全理解它的意思。后来经过讨论才发现 SPServer 的做法和它描述的做法非常相似。

论坛徽章:
0
发表于 2007-07-11 13:19 |显示全部楼层

回复 #12 iunknown 的帖子

找到了一个用模拟 async IO 来实现 Proactor 的文章。
Comparing Two High-Performance I/O Design Patterns
ACE  自带的 proactor 只能在支持异步 IO 的操作系统上才能使用,比如 windows 有 overlapped ,部分 unix 平台有  aio 。
这篇文章描述了如果使用 event-driven 来模拟异步 IO ,从而实现 proactor 模式。


Comparing Two High-Performance I/O Design Patterns 这篇文章不错,有没有考虑过按照这篇文章所说的设计基于 libevent 来实现一个正宗的 proactor ?这篇文章提到的 TProactor 仍然依赖于 ACE ,如果基于 libevent 实现一个 proactor,应该算是一个轻量级的 proactor,应该还不错。

PS:不知道有没有人知道有另外的轻量级的 proactor 的实现?

论坛徽章:
0
发表于 2007-07-11 20:56 |显示全部楼层

“正宗”的 Proactor

有没有考虑过按照这篇文章所说的设计基于 libevent 来实现一个正宗的 proactor ?这篇文章提到的 TProactor 仍然依赖于 ACE ,如果基于 libevent 实现一个 proactor,应该算是一个轻量级的 proactor,应该还不错。


对于“正宗”的 ACE Proactor 接口怎么和线程池结合还没有搞得很清楚。ACE 自带的例子看得不是很明白。
找时间重新看看 ACE 的例子,期望能够看得明白些,到时再考虑是否实现一个“正宗”的 Proactor 。
就目前实现的这个“非正宗”的 Proactor ,主要的差距是使用者对于 Proactor 的操作受到比较多的限制,没有“正宗”的 Proactor 那么灵活。在 0.5 版本中加入了一个 Dispatcher 的类,部分地解决了这个问题,使得核心的线程池框架可以应用到 server socket ,也可以应用到 client socket 上。

[ 本帖最后由 iunknown 于 2007-7-11 20:59 编辑 ]

论坛徽章:
0
发表于 2007-07-13 13:11 |显示全部楼层

apache 的 worker 模型

在 0.5 版本中加入了一个 Dispatcher 的类,部分地解决了这个问题,使得核心的线程池框架可以应用到 server socket ,也可以应用到 client socket 上。


看了一下 dispatcher 的例子,可以考虑在搞一个进程池 framework 出来,加上这个 dispatcher 就可以实现 apache 的 worker 模型了。按 apache 的做法,设定每个进程最多服务器的请求数,然后自动退出,依靠进程退出时自动回收资源,这样可以使得整个 framework 的稳定性非常好。

在这个论坛好像看到有不少人实现了进程池,不知道有没有人结合进程池和线程池做过实际的应用?

论坛徽章:
0
发表于 2007-07-18 21:56 |显示全部楼层
原帖由 queue 于 2007-7-13 13:11 发表


看了一下 dispatcher 的例子,可以考虑在搞一个进程池 framework 出来,加上这个 dispatcher 就可以实现 apache 的 worker 模型了。按 apache 的做法,设定每个进程最多服务器的请求数,然后自动退出,依靠 ...


有这样的想法,最近也做了一些 research,看了一些现有的 进程池 framework,包括 apache,fastcgi,tinycxx等,正在熟悉进程池 framework 的设计。
fastcgi 的一个实现 --  mod_fcgid ,里面的进程池实现得不错,可惜就是和 apache 结合的太紧密了,要单独抽离出来比较困难。

论坛徽章:
0
发表于 2007-08-11 13:24 |显示全部楼层

spserver 支持 ssl

spserver 0.7 版本发布。这个版本最大的亮点是开始支持 ssl 。
1。spserver 中 socket 相关的操作被抽象为 IOChannel 层
2。ssl 的相关代码被实现为一个 plugin (libspopenssl.so),对于不需要使用 ssl 的用户,不需要引入 ssl 相关的头文件和库
3。原有的使用 spserver 实现的程序,不受影响。如果想使用 ssl 功能,那么只需要增加少数几行代码即可。

代码可以到主页下载:http://code.google.com/p/spserver/

一个 echo 程序的例子
http://spserver.googlecode.com/svn/trunk/openssl/testechos.cpp

  1.         SP_Server server( "", port, new SP_EchoHandlerFactory() );

  2.         SP_OpensslChannelFactory * opensslFactory = new SP_OpensslChannelFactory();
  3.         opensslFactory->init( "demo.crt", "demo.key" );
  4.         server.setIOChannelFactory( opensslFactory );

  5.         server.runForever();
复制代码

[ 本帖最后由 iunknown 于 2007-8-11 13:26 编辑 ]

论坛徽章:
0
发表于 2007-08-15 17:32 |显示全部楼层
认真拜读LZ的blog。。。。。。

论坛徽章:
0
发表于 2007-08-16 15:39 |显示全部楼层
LZ能用C写一个这样的库吗?
我尝试着把它专成C的,呵呵。。。技术不够,还有好多没读懂哦。。。

论坛徽章:
0
发表于 2007-08-16 20:04 |显示全部楼层
原帖由 zsniper 于 2007-8-16 15:39 发表
LZ能用C写一个这样的库吗?


其中的线程池部分开始是用纯 C 实现的。
http://iunknown.javaeye.com/blog/38544

如果要把 SPServer 移植到 C 上面,应该不是太难。
SPServer 很少用继承,大部分是采用基于对象范式(object-based paradigm)来实现的。
用基于对象的方式设计的类,可以很容易地用 struct + global function 来实现。
唯一的用了继承的地方是 SP_Handler ,但是这个 SP_Handler 全部是纯虚函数,也可以用一个包含多个函数指针的 struct 来替代。

不过我暂时没有计划移植到 C 上,暂时想进一步完善现有的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP