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 核心可调度大量协程,当然我们可以并发处理更多的业务。以下是一个并发处理的例子:
functiondownload(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还是一个新生的项目,目前大家可以尝试用aLiLua做些小应用,也欢迎大家为aLiLua贡献代码。