BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

EventMachine:高速可伸缩的事件驱动I/O框架

| 作者 Mirko Stocker 关注 0 他的粉丝 ,译者 李明(nasi) 关注 0 他的粉丝 发布于 2008年8月4日. 估计阅读时间: 10 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

EventMachine是一个基于Reactor设计模式的、用于网络编程和并发编程的框架。Reactor模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用程序逻辑,而不需引入多线程来把代码复杂化。

EventMachine提供了一个网络套接字和隐藏底层操作的高层接口。EventMachine的目标是

  • 拥有极高的可伸缩性、性能和稳定性,适用于大多数苛刻的生产环境;并且
  • 提供可以消除高性能多线程网络编程的复杂性的API,使得工程师可以专心于产品逻辑本身

来看一个小例子,一个简单的聊天服务器:

 require 'eventmachine'

module Chat
 
# Called after the connection with a client has been established
  def post_init
# Add ourselves to the list of clients
  (@@connections ||= []) << self
send_data "Please enter your name: "
  end

  # Called on new incoming data from the client
  def receive_data data
  # The first message from the user is its name
  @name ||= data.strip
 
@@connections.each do |client|
  # Send the message from the client to all other clients
  client.send_data "#{@name} says: #{data}"
  end
  end
 end

# Start a server on localhost, using port 8081 and hosting our Chat application
EventMachine::run do
 EventMachine::start_server "localhost", 8081, Chat
end

我们采访了EventMachine(EM)的主要开发人员Francis Cianfrocca。我们询问了他开发EventMachine的动机是什么:

最初我启动这个项目是因为我打算写一个高性能的、面向消息的中间件,以便可以在脚本语言(包括Ruby)下面开发起来更方便。如今已经有很多很多基于EM的项目了,但是那个中间件项目却还没搞定呢!我试图寻找一种方法来创建高度可伸缩的、适用于访问策略执行解决方案。并且我还需要一个足够高速的通信框架,而且还内建安全保障。

EventMachine使用了Thin(高速而简单Ruby Web服务器)Swiftiply(用于网络应用的集群化代理服务器)、Evented Mongrel(网络流量由EventMachine处理的Mongrel)、Sparrow(基于memcache的轻量级的队列)和Juggernaut(Ruby on Rails的插件,服务器可以初始一个连接并将数据推送给客户端)。Francis同时也编写了自己的Web框架:

我的框架叫做Unicycle,它主要为REST化的应用而设计,就是那些对于那些需要通过Web请求和其他应用进行交互的网络应用。它也是基于EM的,使用的是EM内建的HTTP服务器。

EventMachine的0.12版最近刚刚发布了:

在0.12版中我们作了一些性能的提升并引入了一些小特性,但最主要的是,我们发布了一个二进制的gem,而它包括了自0.8版以来的所有特性。

EventMachine的核心是Reactor,最初是由C++实现的,并可以被除了Ruby以外的其他语言使用。而且也有一个纯Ruby的实现,在下个版本中还有一个Java的实现,是用JRuby编写的:

待 发布的新特性中最重要的就是对JRuby的全面支持。想要这样就要用Java完全重写reactor核心。其实不但做到了,而且做得不错。Charles Nutter和他的团队在JRuby上硕果累累,而且我认为还有巨大的潜力。我同时对Rubinius也颇感兴趣。Rubinius的有趣之处在于其对纤 程(Fibers)的支持,这会使得EM的编程风格更加自然。我已经试用了Ruby 1.9,但是我在更多的人使用新平台之前还没想好要不要升级API。EM的关键设计目标之一便是要保持最大的兼容性。

我们请Francis详细的谈谈EventMachine的优势:

从 技术上说,使用EM的重要原因就是,它引入了一种避免使用线程的编程模型。线程化编程当然早就被大家所熟知,尤其是在网络服务器方面,但是它也存在很多顽 疾。有一类问题是很适合用线程化模型来解决的,网络服务器就是其中之一。因为它通常需要为每个请求创建一个不相交的工作集。但是如果在线程之间有共享状态 的话,那么要让多线程程序100%正确运行是相当困难的,又或者它依赖于跨线程的操作顺序的正确性。在Ruby中,这种线程化所导致的问题是非常严重的。

另外一个使用EM的理由就是,我们广泛地支持各种网络协议。我们的目标就是可以提供给开发者们一个庞大、成熟而又高性能的工具集合,可以让他们轻松地在自己的应用中使用。这也是为什么EM与其他很多工程的不同之处,它们仅仅是试图去简单地实现一个reactor模型而已。

我们也谈到了为什么相比较线程模型而言,事件驱动编程更加易用:

有 种说法是,从理论上说事件驱动编程并不比线程化编程快到哪里去,这是没错。但是在实践当中,我认为如果你想在保持最大可靠性的情况下能够获得最高的可扩展 性和性能的化,事件驱动模型更容易做到。我写的程序可以几个月甚至几年运行正常,没有崩溃,没有内存泄露,没有存在任何性能问题。因此在实践当中,事件驱 动编程更棒。现在,对于事件驱动编程来说还有个问题:那就是你需要“退步地”去编写程序。在线程模型中,程序状态被存在运行时的一个栈的本地变量中(尽管 很低效)。而在EM中,你需要自己去做这件事,这对于习惯于线程的程序员来说就很不直观。这也是为什么我对纤程(Fibers)感兴趣的原因,因为它可以 让程序看上去很像是那些喜欢I/O阻塞的程序员们写出来的。

更具体一些,拿HTTP服务器举例:

试 想一个使用线程的HTTP服务器,你只需简单地读取套接字然后阻塞,直到数据从另一端传输过来。如果使用事件的话,你就省去了等待或者调度上的开销,数据 一来你就收到了──但是数据可能是不完整的!在程序中你需要判断对于这个请求你是否收到了完整的数据,如果不是的话你就要存贮中间数据。但是你的程序处理 的下一个事件可能就是另一个连接传来的数据,所以你需要把这些都存下来。线程化抽象使用了一种很重量级的方式来保证工作集独立,因此按理说它也更为直观一 些。但是事件化模型也并不是十分难学。不过,我依然认为这是推广事件驱动编程的最大壁垒。

幸运地是,这正是EventMachine的专长:

目 前EM做到的一点就是,将基本协议包装起来,将所有这些从程序员面前最大化地隐藏起来。不像那些仅仅提供了一个reactor核心的底层库(比如 libev),EM希望可以提供所有标准网络协议的鲁棒实现,比如Email等等。EM包含了一个精心编写的处理器,SMTP的客户端和服务器端都支持。 因此EM的程序员仅需要为完成Email消息相关事件编写代码即可,并不需要接触到底层协议。但是你还可以享用到事件模型的其他优点,比如高速度和高伸缩 性等等。

你可以在Rubyforge的官方站点或者rubyeventmachine.com上找到更多关于EventMachine的信息:

我们最近刚刚开通了社区网站rubyeventmachine.com, 这是个Trac系统,由Jason Roelofs搭建。还有EventMachine的IRC频道。包括Kirk Haines、James Tucker(raggi)和Aman Gupta(tmm1)在内的很多人都对EM贡献甚多。Thin的贡献者Marc-André Cournoyer也提供了很多想法。

查看英文原文:EventMachine: Fast and Scalable Event-Driven I/O Framework

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT