李德寬
近年來使用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