分布式之高性能组件
2016-04-24 22:21
260 查看
(迁移至博客园)
因为毕业设计(实时分析大型数据流),开始对分布式并行计算做研究,第一个问题就是通讯。高性能的通讯是整个系统性能的基本保障。
异步非阻塞是为了避免因IO而阻塞进程(或是线程)而造成计算资源的浪费
使用资源池(连接池)是为了应对高并发
方案是这样,要说理由的话就得说一大堆,牵扯很多东西
IO 操作是基于OS,windows系统提供俩类IO,一种是同步IO(如上面描述的一样),一种是异步IO(其他OS也提供这样的操作,但并不是所有的OS都支持的很好)。异步IO与同步IO的区别在于谁去真正执行IO操作。在同步IO中是由用户进程执行IO;在异步IO中,则有OS分派另外的内核线程来执行,待数据准备好之后再将数据交由用户进程处理,在内核线程执行IO的时候,用户进程可以处理其他事情,并未被阻塞,这是异步IO高效的原因。
在stackoverflow 还有一个讨论链接,感性趣的可以看看
另外还有Erlang的解决方案(之前公司小组的leader推荐了Elixir,准备看看),per connection per process, OTP ,所以有好多选择啊!
因为毕业设计(实时分析大型数据流),开始对分布式并行计算做研究,第一个问题就是通讯。高性能的通讯是整个系统性能的基本保障。
方案
就目前的经验来讲,最好的通信选择是:异步非阻塞IO + 资源池。异步非阻塞是为了避免因IO而阻塞进程(或是线程)而造成计算资源的浪费
使用资源池(连接池)是为了应对高并发
方案是这样,要说理由的话就得说一大堆,牵扯很多东西
程序运行背景
以往常规的代码都是单线程同步的代码,指令的执行顺序和书写时一致,当遇到IO(文件操作或是网络操作),通常都会阻塞线程,那么OS会让其他线程获得CPU资源,这使得你的程序停滞了,当有其他请求进来时得不到处理,自然系统性能也就降低了。传统的方法是用多个线程处理多个请求,就像运行php的apache服务器一样,然而线程是昂贵的,自然也不是较好的选择。IO 操作是基于OS,windows系统提供俩类IO,一种是同步IO(如上面描述的一样),一种是异步IO(其他OS也提供这样的操作,但并不是所有的OS都支持的很好)。异步IO与同步IO的区别在于谁去真正执行IO操作。在同步IO中是由用户进程执行IO;在异步IO中,则有OS分派另外的内核线程来执行,待数据准备好之后再将数据交由用户进程处理,在内核线程执行IO的时候,用户进程可以处理其他事情,并未被阻塞,这是异步IO高效的原因。
ACE && netty
ACE
ACE是Douglas Schmidt开发的一个C++网络编程库,实现了Reactor 和 Proactor俩种模式。其中Reactor模式以类似异步的方式编写代码,但IO实际上是同步的;Proactor则是利用OS的异步IO而编写,是真正意义上的异步IO。可以看这里链接,有对俩种方式的简要介绍,作者还自己写了一个TProactor,非常有意思!因为真正意义上的IO与OS密切相关,不同OS提供的API都不一样,跨平台是一个非常繁琐的问题,需要你了解不同OS的差异,使用别人经过严格测试的框架是一个非常明智的选择。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的占用。在stackoverflow 还有一个讨论链接,感性趣的可以看看
另外还有Erlang的解决方案(之前公司小组的leader推荐了Elixir,准备看看),per connection per process, OTP ,所以有好多选择啊!
相关文章推荐
- 分布式版本管理git入门指南使用资料汇总及文章推荐
- C#分布式事务的超时处理实例分析
- Erlang分布式节点中的注册进程使用实例
- C++实现的分布式游戏服务端引擎KBEngine详解
- ASP.NET通过分布式Session提升性能
- Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法
- Python使用multiprocessing实现一个最简单的分布式作业调度系统
- 分享一个简单易用的RPC开源项目—Tatala
- 手把手教你配置Hbase完全分布式环境
- 搭建分布式架构2--CentOs下安装Tomcat7(环境准备)
- 搭建分布式架构4--ZooKeeper注册中心安装
- Glusterfs:趋于成熟的集群文件系统
- 关于glusterfs的directory-layout-spread参数
- tomcat集群扩展session集中管理,Memcached-session-manager...
- 多任务分布式并发处理
- Redis集群快速搭建
- 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南
- 分布式架构之我见 (片段)
- #分布式系统架构之# 事件驱动模式以及与之匹配的长时间处理过程讨论
- Storm配置属性和操作命令