EventMachine的性能研究及应用
2016-07-10李德宽
李德宽
近年来使用Ruby语言来开发监控告警模块也越来越频繁,监控告警模块需要极高非阻塞和并发事件处理能力,然Ruby语言自身对非阻塞操作的支持不多。使用EM可以解决请求易阻塞和并发事件处理能力不强等问题。本文对EM的并发性能以及网络性能进行研究和分析。此外,本文还将对EM在网络编程方面的能力进行研究。通过这些研究表明EM具有极高非阻塞和并发事件处理能力以及强大的网络性能。
【关键词】Ruby EventMachine 非阻塞 高并发 网络协议
Ruby语言是一种为简单快捷的面向对象编程而创立的脚本语言,于20世纪90年代由日本人松本行弘开发。Ruby on Rails(简称 Rails)基于Ruby语言编写的一个通用高效Web开发框架,由于其部署容易、开发效率高、功能丰富、包管理便捷等特点,使用 Rails 开发的 Web 项目日渐增多。
1 EM的实现原理
EM广义上来讲是指任何采用EM事件处理机制的这类程序包或程序实现,而这里的EM特指的是基于Ruby实现的支持EM机制的Ruby 类库,它使用Reactor模式提供事件驱动下的非阻塞IO,下面将从其本身的Reactor模式以及Event Loop进行分析,并阐述其实际应用中起到的作用。
1.1 Reactor模式简述
Reactor模式描述了一种服务处理器,它接受各种类型的抽象事件并将这些事件分发给已注册的事件处理器进行处理。Reactor模式会直接的并行将请求根据类型分发给对应的事件处理器,而不是同步等待每个请求执行完成。这种模式清晰的分离了事件的分发时序和事件的处理逻辑。
基于以上的分析,我们可以推论出EM本身是支持并发处理的。
1.2 Event Loop简述
EM模型基于事件轮询(Event-Loop)机制,Event Loop的机制在EM中体现为Dispatcher和Event Handle的配合。
为了理解Event Loop的工作机制,可以先从单线程程序的时间处理运行模式入手。多线程的程序不仅会占用多倍的系统资源,还会遇到跨线程通信、多线程对同一个变量同时操作等等的问题,这样显然无法在保障系统的稳定性的同时确保系统的扩展性。而Event Loop就是为了解决这个问题而提出。
每当遇到I/O请求的时候,主线程令Event Loop线程调相应的I/O程序,然后接着往后运行,所以不存在等待时间。等到I/O程序完成操作,Event Loop线程再把结果返回主线程。主线程就调用事先设定的回调函数,完成整个任务。
因此线程的可用空闲时间增加,主线程得以运行更多的任务,提高了效率。这样就实现了非堵塞模式。
2 Event Machine在网络编程中的应用
2.1 EM搭建TCP的案例来源
前面我们阐述了EM的Event Loop的优势。现在,我们就通过实际案例来实践EM搭建TCP,并且进行相应的业务处理。
我们知道,在生活中有很多传感设备分布在身边的各个角落,这些传感设备无时无刻不在测量和传输新鲜出炉的测量数据,这些数据都亟待保存,因为传感器绝对没有空间去存储这些数据。
那么,面对这样的大规模,高并发的数据,我们应该怎样应对,让它平稳的运行在系统管控之下呢?我们可以用到我们的EM来搭建TCP服务器解决这个问题。
2.2 信息流程分析
信息源,就是我们分布在各个角落的信息化监控设备。
传输的信道,就是开放的空间。在集成的蜂窝通信协议的基础上,这些硬件大多集成了基础的分组数据传输协议,在分组数据传输协议上面又封装了TCP/IP协议的支持。
接收的设备,就是我们的服务器。
信息源将传感器部件采集到的数据收集到一起,按照一定的规则拼接组合起来,形成原始数据。为了保证传输的安全性,这些数据会被加上循环校验码和长度信息,在发送前,这个信息会被封入TCP的数据包,传输出去。
传输过程中,因为通过的链路可能存在差异,所以数据到达服务器的时间顺序不一定一致。极有可能出现顺序靠前的数据后到,而顺序靠后的数据先到的情况。当然,这个已经由TCP协议的系统实现来为我们进行了处理。
接收到通过TCP协议传输来的数据的时候。服务端会将接收到的数据分配到注册的处理器进行处理。如下的一小段代码,就是向分配器注册事件处理对象。
EM.run do
EM.start_server 127.0.0.1, ‘8089, EchoServer
end
我们可以看到,这段代码向系统注册了监听器,监听发向IP地址为“127.0.0.1”,目标端口为“8089”的数据响应。响应数据到达事件的处理程序,就是EchoServer这个对象。
进一步的深入EchoServer对象,我们可以发现它的基本结构遵循这样的规则:
一定有post_init和receive_data这两个接口。
这种设计模式,确保了负责处理的程序的充分自主性。处理事件的程序只需要确保实现这两个接口,就可以接入到EM的Event Loop中,接收属于自己的事件。
一个EM实现的基本框图如下所示。
EM处理主事件循环,如果有事件出现(例如呼入请求),EM将根据已注册的事件处理程序对事件进行分发,交由注册的程序进行处理,如果是未注册的请求事件,则EM会将它们抛弃,不予处理。
3 结论
本论文给出了一种解决Ruby语言在监控告警模块中自身对非阻塞操作支持不多的方法EM,并通过对EM中Event Loop的研究,发现EM能够提供非阻塞 IO 的支持。
在网络应用方面,通过EM搭建TCP协议作为例子,EM能够广泛地支持各种网络协议。相对于传统的网络协议,在面对这大规模、高并发的数据时,我们的EM搭建TCP的服务器可以使数据平稳的运行在系统管控之下。
作者单位
武汉理工大学信息工程学院电子与通信工程 湖北省武汉市 430070