关于NIO和mina的一些应用场景

最近工作中有一个需求,因而产生了一个产品的demo.走了一些弯路,在这里写下来。

需求是这样: 我们需要一台网络客户端服务器,这台服务器做为客户端去连接上万台服务器,实时的从服务器读取不同的文本,然后解析,清洗,转换入库。对端文本服务器的ip:port 及对应的文本格式从通过一条连接获取,与爬虫不同的是要维持持久的长连接。

首先想到的是mina.虽然没有使用过,但mina的大名如雷贯耳。用mina来管理连接,使用filter来处理文本,最后handler统一入库。但是两天研究下来,发现mina并不能满足需求。

mina的典型应用是在服务端,Acceptor监听连接事件,有客户端到来时,建立连接丢给processor线程池处理,所有的IO统一经过一个filter链。

但是客户端和我想象的完全不同。首先一个Connector并不能管理上万的channel.其次所有的IO事件要经过统一的filter链处理,但需求要求每个连接只经过自己独特的解析转换流程。

mina的每个NIOConnector都会打开一个selector。作为一个客户端服务器需要创建很多channel,但selector却只能有一个或者几个。我想mina应该加入NIOClient的概念:用一个selector来管理很多channel的connector事件。

另外关于NIO性能,相比于传统阻塞IO,如果不需要管理大量IO任务的话,完全没必要使用NIO。开几十个线程能搞定的不要使用NIO,那样并不能增加性能,却增加不少的开发复杂度。NIO比IO性能好是因为,在高并发IO处理时,比如同时处理上万连接的WebServer,相比阻塞IO节省了无效的线程切换时间。低并发IO的线程切换时间占比很少,因此效果提升有限。

blog comments powered by Disqus