论坛首页 Java版 企业应用

IOCP技术讨论

浏览 8702 次
该帖已经被评为精华帖
作者 正文
时间:2004-09-17
albert_qhd 写道

是我没说明白,sorry
这里有两个问题:
1、HRM如何主动调用
2、OA提供怎么的接口供别人调用

对于第一个问题,按我的理解,SOA应该是个系统架构,应该包括类似BPM的东东。这样的话,你就可以配置一下接口使HRM主动调用。
第二个问题,OA系统提供web service接口。别的系统就可以很方便的调用了


不知道你用的数据库是什么, 如果是oracle, 这样的系统我到是做过几个,
第一个4-5年前是给bank做的, 是当数据库记录变化时, 通知work flow系统, 我是在oracle里加了个trigger, 然后调用c写的一个external stored proc, (当时oracle还是8, 不是8i, 不支持java stored proc ), 这个external stored proc用socket发消息给work flow, work flow系统有socket的接口.

二是后来给一个保险公司写的数据交换系统, 接受端是我用java写了一个socket server, 发送端也是个trigger, 调用的是java stored proc, 由于java socket 可以用write_object, read_object, 传递对象还是比较方便的.
oracle也有个pl_sql package UTP_TCP可以做socket, 不过他只有write_line, 但速度比java proc快.

三就是最近写的, 用java stored proc调用web service, 由于axis soap sdk不在oracle 9i的自带java package里, 我想用load_java去把axis soap sdk调入oracle, 不过没成功, 我后就把OC4J里带的一个soap sdk调入oracle了, 这个sdk比较原始, soap报文都得自己用xml写, 听说oralce 10g有了很大增强.提供了native plsql 的soap sdk.

我感觉就运行效率和结构来说, 第二种最好, soap的速度还是不好, 不适合用于real time项目, 不过传传消息还行.

但自写的java socket server也有负载上的问题, 我们知道, java 是用ServerSocket class来做的, 这种是基于select模型, 就是一个client一个thread连接, 这样当长连接一多, thread数就会提上去, 系统响应就会变慢, server稳定性也会变差. 一般2-300个client就可以把系统搞死

但多数web server的socket server都不是用select模型, 大多数用的都是IOCP技术, 用overlap的方法让多client socket connection共享一个thread, 但这种编程的工作量很大, 对于商业的web server来说可以, 但对于一般项目用的很少, 一些游戏服务器用的是这个, 我听说盛大的游戏服务器用的就是这个, 一个服务器可以挂2000多个client. 不过他不是用java写的.

所以web service在大负载上比自写的java socket server有优势
   
时间:2004-09-17
yyanghhong
引用
但多数web server的socket server都不是用select模型, 大多数用的都是IOCP技术, 用overlap的方法让多client socket connection共享一个thread, 但这种编程的工作量很大, 对于商业的web server来说可以, 但对于一般项目用的很少, 一些游戏服务器用的是这个, 我听说盛大的游戏服务器用的就是这个, 一个服务器可以挂2000多个client. 不过他不是用java写的.

其实IOCP就是一个线程池的概念,它的作用就是减少了创建线程和系统转换线程上下文环境的开销。
java里面就有了实现线程池的concurrent包,
我的理解是concurrent包完全可以做到IOCP技术。
我开发的接口系统并发数可以达到2000左右。
当然系统配置要高一点。
   
0 请登录后投票
时间:2004-09-17
firebody 写道
yyanghhong
引用
但多数web server的socket server都不是用select模型, 大多数用的都是IOCP技术, 用overlap的方法让多client socket connection共享一个thread, 但这种编程的工作量很大, 对于商业的web server来说可以, 但对于一般项目用的很少, 一些游戏服务器用的是这个, 我听说盛大的游戏服务器用的就是这个, 一个服务器可以挂2000多个client. 不过他不是用java写的.

其实IOCP就是一个线程池的概念,它的作用就是减少了创建线程和系统转换线程上下文环境的开销。
java里面就有了实现线程池的concurrent包,
我的理解是concurrent包完全可以做到IOCP技术。
我开发的接口系统并发数可以达到2000左右。
当然系统配置要高一点。


IOCP和线程池还是有差别的, 线程池用于有很多socket短连接的环境, 但不适用与有大量socket长连接环境, 比如游戏服务器, 人上去就不下来, 这都是长连接, 这时线程池里的线程依然会很多, 2000个线程对系统是个很可怕的概念, 除非socket只是挂者啥也不干.
   
0 请登录后投票
时间:2004-09-17
yyanghhong 写道
firebody 写道
yyanghhong
引用
但多数web server的socket server都不是用select模型, 大多数用的都是IOCP技术, 用overlap的方法让多client socket connection共享一个thread, 但这种编程的工作量很大, 对于商业的web server来说可以, 但对于一般项目用的很少, 一些游戏服务器用的是这个, 我听说盛大的游戏服务器用的就是这个, 一个服务器可以挂2000多个client. 不过他不是用java写的.

其实IOCP就是一个线程池的概念,它的作用就是减少了创建线程和系统转换线程上下文环境的开销。
java里面就有了实现线程池的concurrent包,
我的理解是concurrent包完全可以做到IOCP技术。
我开发的接口系统并发数可以达到2000左右。
当然系统配置要高一点。


IOCP和线程池还是有差别的, 线程池用于有很多socket短连接的环境, 但不适用与有大量socket长连接环境, 比如游戏服务器, 人上去就不下来, 这都是长连接, 这时线程池里的线程依然会很多, 2000个线程对系统是个很可怕的概念, 除非socket只是挂者啥也不干.

长连接的socket,我确实没做过,我的是短连接的。但是无论长连接还是短连接,基本原理应该是一样的,线程池在里面充当至关重要的角色。
至于你说的长连接,我想能够并发这么多线程的关键技术还是线程的调度,估计系统对于这么多线程的调度应该有一套很合理也很周密的悬挂调度算法,说白了,就是设法让每一个并发的线程尽可能的suspend或者sleep,让别的线程获得CPU时间。每一个游戏的核心设计者,都会华很大精力做这个调度的设计,优化的精度可以达到100毫秒级。
我想,这是个人无法做到的。我实现的仅仅是短连接的并发
   
0 请登录后投票
时间:2004-09-18
要那么多线程干什么,我正好在写一个IM的服务器,几个线程足矣,Java1.4可以nonblocking,即使在1.4之前也有很多异步库

当然适当的线程可以起到一定的作用,详细还是参见
http://www.eecs.harvard.edu/~mdw/proj/seda,
它可以自适应线程的数目
   
0 请登录后投票
时间:2004-09-18
potian 写道
要那么多线程干什么,我正好在写一个IM的服务器,几个线程足矣,Java1.4可以nonblocking,即使在1.4之前也有很多异步库

当然适当的线程可以起到一定的作用,详细还是参见
http://www.eecs.harvard.edu/~mdw/proj/seda,
它可以自适应线程的数目


异步通讯的高级技术就是IOCP, 要做到最好的效率, 只能在系统内核做中断, Java1.4是2002年出来的吧, 我后来也没用java作过socket server了.
   
0 请登录后投票
时间:2004-09-18
IOCP是什么东东,我怎么从来没听说?快告诉我?
   
0 请登录后投票
时间:2004-09-18
potian 写道
IOCP是什么东东,我怎么从来没听说?快告诉我?

完成端口
   
0 请登录后投票
时间:2004-09-18
这有个c++的例子,
http://www.codeproject.com/internet/iocp.asp

IOCP是windows 2000以后出来的, 被公认是做异步通讯效率最高的, linux下也有了响应的东西.
   
0 请登录后投票
时间:2004-09-18
怪不得我从来没看到过,原来是MS的东东
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐