分布式之高性能IO组件

由于毕业设计(实时分析大型数据流),开始对分布式并行计算作研究,第一个问题就是通信。高性能的通信是整个系统性能的基本保障。php

方案

就目前的经验来说,最好的通讯选择是:异步非阻塞IO + 资源池。html

  • 异步非阻塞是为了不因IO而阻塞进程(或是线程)而形成计算资源的浪费
  • 使用资源池(链接池)是为了应对高并发

方案是这样,要说理由的话就得说一大堆,牵扯不少东西java

程序运行背景

以往常规的代码都是单线程同步的代码,指令的执行顺序和书写时一致,当遇到IO(文件操做或是网络操做),一般都会阻塞线程,那么OS会让其余线程得到CPU资源,这使得你的程序停滞了,当有其余请求进来时得不处处理,天然系统性能也就下降了。传统的方法是用多个线程处理多个请求,就像运行php的apache服务器同样,然而线程是昂贵的,天然也不是较好的选择。node

IO 操做是基于OS,windows系统提供俩类IO,一种是同步IO(如上面描述的同样),一种是异步IO(其余OS也提供这样的操做,但并非全部的OS都支持的很好)。异步IO与同步IO的区别在于谁去真正执行IO操做。在同步IO中是由用户进程执行IO;在异步IO中,则有OS分派另外的内核线程来执行,待数据准备好以后再将数据交由用户进程处理,在内核线程执行IO的时候,用户进程能够处理其余事情,并未被阻塞,这是异步IO高效的缘由。golang

ACE && netty

ACE

ACE是Douglas Schmidt开发的一个C++网络编程库,实现了Reactor 和 Proactor俩种模式。其中Reactor模式以相似异步的方式编写代码,但IO其实是同步的;Proactor则是利用OS的异步IO而编写,是真正意义上的异步IO。能够看这里连接,有对俩种方式的简要介绍,做者还本身写了一个TProactor,很是有意思!由于真正意义上的IO与OS密切相关,不一样OS提供的API都不同,跨平台是一个很是繁琐的问题,须要你了解不一样OS的差别,使用别人通过严格测试的框架是一个很是明智的选择。apache

netty

netty是java世界的非阻塞IO库,netty是按Reactor模式设计,使用一个单独的线程做为event demultiplexor ,java鄙人不熟,也不清楚其线程建立的开销是否大。不过能够肯定的是在java的世界netty是最好的选择。编程

Golang blocking IO && node.js non-blocking IO

关于这个,很是感谢国外一个同行作的测试连接,从测试结果看来node.js 的异步非阻塞IO的性能低于Golang的阻塞IO。为何呢,主要缘由有俩个:一 是语言的runtime,解释型语言确定比不过编译型语言,但这不是主要因素;最主要的因素是在Golang里面虽然是以阻塞的方式编写代码,可实际运行的时候不一样goroutine之间能够进行很是高效的切换,代价远低于传统的线程切换(Golang的调度器作了异步IO的操做,对使用者屏蔽了底层问题),工做原理相似协程。因此IO阻塞对于Golang编写的程序来说不是一个问题,一个goroutine阻塞了,其余的goroutine能够继续运行,整个系统并无放弃对CPU的占用。windows

在stackoverflow 还有一个讨论连接,感性趣的能够看看服务器

另外还有Erlang的解决方案(以前公司小组的leader推荐了Elixir,准备看看),per connection per process, OTP ,因此有好多选择啊!网络

相关文章
相关标签/搜索