天天看點

aLiLua web架構——node.js般的異步處理遇上PHP般的開發效率

aLiLua是基于Lua語言的一款網絡服務開發架構, 使用 epoll 進行網絡/檔案IO事件讀寫,對Lua協程進行排程,性能高效,使用簡單。

為什麼會有aliLua?

又拍雲

oneoo

欣賞 node.js 高效的異步處理,但是不喜歡 node.js 累人的基于回調的開發節奏,是以想到了 Lua 這個開發效率跟 PHP 一樣快,而同步邏輯比 node.js 清晰的語言。于是,aliLua就誕生了。

Lua 語言

Lua是一種輕量語言,它的官方版本隻包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快。它用标準C語言編寫并以源代碼形式開放,編譯後僅僅一百餘K,可以很友善的嵌入别的程式裡。和許多"大而全"的語言不一樣,網路通訊、圖形界面等都沒有預設提供。但是Lua可以很容易地被擴充:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就内置的功能一樣。事實上,現在已經有很多成熟的擴充子產品可供選用。

Lua是一個動态弱類型語言,支援增量式垃圾收集政策。有内建的,與作業系統無關的協作式多線程(coroutine)支援。

aLiLua 核心通過 epoll 處理異步IO事件,并引入 Lua 語言用于業務邏輯處理。aLiLua 的事件核心可非常高效的排程多個 Lua 協程,使之協同工作以實作高并發的網絡服務。

簡單的同步邏輯

在 aLiLua 開發架構之下的 Lua 腳本跟 PHP 類語言類似,但卻支援異步IO,隻消耗很小的系統資源就可達到很高的處理能力。以下是一個簡單的例子:

local sock = cosocket:tcp()

local r,e = sock:connect(host, port)

r,e = sock:send(...)

r,e = sock:read(...)

print(r)

上面5行代碼,中間3行就是異步的網絡IO操作。看上去是不是跟 PHP 很像?作為 Lua 腳本開發者無需關心IO操作如何進行異步操作,隻要專心于業務邏輯的開發就可以。

輕松的并發處理

aLiLua 核心可排程大量協程,當然我們可以并發處理更多的業務。以下是一個并發處理的例子:

function download(host, uri)

  return newthread(function(host, uri)

    local sock = cosocket:tcp()

    local r,e = sock:connect(host, port)

    r,e = sock:send(...)

    r,e = sock:read(...)

    return r,e

  end, host, uri)

end

local t1 = download('www.alilua.com', '/')

local t2 = download('www.alilua.com', '/docs.html')

local r,e

r,e = wait(t1)

r,e = wait(t2)

上面的例子可以并行下載下傳兩個頁面,跟下載下傳工具的多線程下載下傳類似,可在一個時間内一起做幾件事情,提高效率。并且使用協程并發處理比起多線程所消耗的系統資源更少。

高性能

根據

aLiLua開發者作的測試

,由于 Lua 是調用 aLiLua 提供的 sendfile 方法發送頁面内容,屬原生 c 代碼進行處理,是以性能明顯高于 nodejs。占用的系統資源也是以會低于 nodejs,從 0~5000 并發情況看,其占用的資源跟并發數成正比,比較穩定。當與MySQL交換資料時,Lua 即使在 5000 高并發的情況下依然能保證很高的執行效率,而 nodejs 則不太穩定。

aLiLua web架構——node.js般的異步處理遇上PHP般的開發效率

項目首頁

aliLua還是一個新生的項目,目前大家可以嘗試用aLiLua做些小應用,也歡迎大家為aLiLua貢獻代碼。