为什么重复制造轮子 – aLiLua

其实早在 2010 年我就在 Lua 用于 Web 开发方面做过尝试,当时还以 PaaS 形式对外提供服务的。但工作重点转移到云存储方向,并且服务也没见起色就停止维护了。

而到了 2013 年工作稍微轻松,想搞点小东西玩玩,也尝了把 node.js,但过程中发现基于回调的形式进行 Web 开发还是比较累的,开发效率相对于 PHP 低得多,尤其是业务逻辑多起来的时候。但 node.js 的异步处理效率很高,换用 node.js 是有得也有失啊。这让我再次想起 Lua,这个开发效率跟 PHP 一样快,同步逻辑的思维相对 node.js 来说清晰太多了。但之前做的 yo2lua 项目由于个人对 Lua 的了解不够深入,基于堵塞 IO 实现,可以说性能一败涂地。当时居然还搞什么 PaaS,搞笑了~(个人经验:回头看自己,会发现有很多sb,哈哈)既然这样我就重新搞搞 Lua 吧,aLiLua.com 这个域名在 2010 年做 yo2lua 的时候就注册好了,现在就以此名开展这个开源项目。

设计目的:
1. 开发简单、效率高
2. 运维简单、性能高
3. 稳定性高、资源消耗少
4. 满足 Web 开发中的常用功能需求

Lua 语言跟 PHP 类似的同步逻辑开发模式,满足开发效率要求。而 Lua 语言的运行效率可以说是这么多高级语言当中的佼佼者,满足性能高的要求。并且该语言至今已迎来第 20 个生日,在语言本身而言是非常稳定的。

为了简化运维和提高性能,所以决定采用 epoll 事件来驱动整个系统,而不是基于 nginx 来实现。(在第一版成熟后,会考虑其他平台的支持)当然完全自主实现有各有利弊,好处是可定制性高、相对的业务逻辑少,更纯粹于提供 Web 服务。

aLiLua 第一版所支持的功能列表:
1. cosocket (异步网络IO)
2. connection pool
3. HTTP/1.1 (keepalive)
4. gzip/deflate 压缩
5. session
6. 基于共享内存的 key/value cache (Yac weibo.com 在用)
7. template 模板引擎
8. sandbox (可用于做 PaaS 服务)
9. iconv/字符串处理
10. hooker/filter 钩子和过滤器
11. CLI 支持命令行模式
12. writev/sendfile 高性能的网络操作
13. ssl socket
14. mysql/memcached/redis/http client (由 ngx_lua 提供)

计划功能列表:
1. cron 定时任务
2. queue 任务队列
3. aio 文件异步IO
4. cluster key/value 存储支持集群分布
5. mbstring 字符串处理
6. Web Framework 基于 aLiLua 的 Web 开发框架
7. ssl server
8. msgpack rpc
9. …

在完成第一版时我对 Lua 和 node.js 等做了很多压力测试,性能跟 node.js 差不多,但如用 LuaJit 则高出 30%+。最主要的是 Lua 所消耗的内存和 CPU 都比 node.js 少,且占有率比较稳定。压力测试中使用的业务逻辑会比实际项目少,很可能实际效果比 node.js 更好一些。

aLiLua 是个新生的开发模式,底层兼容 ngx_lua ,大家可以先尝试用 aLiLua 来做些小应用 :) 我们提供免费终生保养服务。更希望大家在使用过程中能提出宝贵意见,以使 aLiLua 更完善

下载地址: https://github.com/yo2oneoo/alilua

正确认识LUA在WEB开发上的特长

  在此前我发表过两篇文章,主要介绍LUA在WEB开发上的尝试和LUA的性能测试。其中它的性能测试是蛮不错的,普通的逻辑运算确实比PHP强,但一旦连接数据库的处理,那么这个优势就缩小了,但也基本有1.5~2倍的处理效率吧 ;) 但这点性能提升好像不足以让我们从应用非常普遍的PHP转到LUA上进行开发吧~包括我自己也只是在项目中的一小块应用上使用了LUA来处理。

  那么LUA如此之简单,很多操作库都需要自己开发来实现。值得吗?当你认识到LUA的真正意义,你会知道这是值得的。

  第一点:你可以用C或LUA本身来实现需要的操作库,如:数据库操作、模板、图片处理、文件处理等等。

  第二点:随心所欲的书写代码,没有什么你是无法实现的。Pool、Hook、Filter等都是非常简单的实现,PHP要实现这些功能却有点难度咯。其中WordPress博客系统上的Hook、Filter应用比较多,正是因为WordPress提供了这样的开发模式,它的插件数量非常的多,并且要开发一个WordPress也是很简单的事情。重点是写WordPress插件,不需要修改它系统本身的代码。正是这样插件才能广泛的流行和安装。如果插件需要修改系统代码来实现,这只能算是个 Hack ,这就无法做到很好的兼容性了。

  Yo2 正在努力开发一个LUA的WEB开发框架, 进一步降低从PHP转入LUA开发的门槛。

  贴一个很简单的LUA代码示例:

function aF()
    return 'b'
end

function aF_filter(b)
    if b == 'a' then return 'aaa' end
    return 'cc'
end

addFilter('aF',aF_filter)

print(aF())

  函数aF的返回值将被aF_filter过滤为cc输出。其中 add_filter 是LUA开发框架提供的函数(框架还包括数据库操作、模板操作、分布式文件操作等等功能唷~)

LUA与PHP在WEB应用的性能对比

  这几天用在WEB开发的LUA框架已经完成,框架中已包括数据库操作和模板操作的功能,能够很简单方便的应用在WEB开发上。在此时我对这个LUA框架和PHP开发的WEB应用分别进行充分的压力测试 ;)

  服务器配置:WEB服务器一台,压力测试服务器一台,均为双核+4G内存,CentOS 64位操作系统

  网络环境:局域网

  软件环境:yo2lua (50线程),Nginx+PHP-FPM (50进程)
       应用程序均为连接MySQL数据库查询1行数据并输出(表中就只有一行数据)

  压力测试软件:httperf+autobench

  操作命令行:autobench –host1=192.168.200.251 –port1=8001 –host2=v2.54xing.com –port2=80 –uri1=/ –uri2=/a.php –quiet –low_rate=500 –high_rate=5000 –rate_step=100 –num_call=1 –num_conn=10000 –timeout=10 –file /tmp/result.tsv
  从500并发起步,直到5000个并发,每次测试以10000个连接为基准取得平均值

result

  从测试结果中分析得出,PHP在并发数达到800的时候,性能出现严重的下降并且不稳定。而LUA则一直达到3200个并发时出现一次突发的性能下降,上升到3800个并发后性能下降一半并且不稳定,但依然能维持在2000个并发以上。

  这份简单的测试告诉我,LUA在WEB应用上,性能可以是PHP的4倍以上,并且LUA在3000个并发时,占用的服务器资源非常少,远比PHP要低得多。

  这个LUA的WEB开发框架定位就是简单、高性能,也许一些复杂的功能无法实现,我认为这部分功能可以转到PHP类的语言进行开发就可以,不必要把这个开发框架变得复杂庞大起来,不然就背离原来简单、高效的宗旨了 :P

  LUA跟C的无缝对接,彻底征服俺了 _-!! ~ 刚用一台四核8G内存的WEB服务器跑个压力测试,稳定达到4500个并发/秒。

LUA-WEB开发的新方向

  从事PHP开发有好几年了,初出茅庐时就接触了PHP和JAVA两种WEB开发语言,其中JAVA主要是SERVLET模式,而PHP则是使用时间最长的一门语言。真正应用在业务上的也就是PHP了。PHP的优点我就不废话了,但并不代表它没缺点。PHP给我最大的困扰就是不支持多线程,不支持异步处理,也正是因为这两点导致PHP容易导致堵塞。

  近期一个项目上,我写了一个简单的PHP开发框架,在这个框架基础上已经做了两个版本的开发,第二个版本是Flash+PHP。其中主要应用到的是JSON-RPC接口部分,PHP要做的基本就是数据逻辑处理方面的工作了。因为有了点经验,所以我就想是否可以从PHP换到LUA类的语言上做WEB开发。

  查看过不少的资料,发现LUA会是一个很好的选择。我看中它的原因就在于LUA跟C的无缝配接上,C与LUA上的代码方法都可以互相调用、共享数据。并且我在去年就自己写了一个WEB SERVER程序,我可以比较简单的在原来的基础上集成对LUA的支持。但也有一个大的问题存在,LUA在WEB应用上的开发资料非常少,国内甚至没有什么WEB项目是使用LUA进行开发的,也许有很多东西需要自己去摸索。据我了解的有lighttd是支持FastCGI模式调用LUA,apache也有个mod_lua,但Nginx方面的资料我就没找着 _-!! (我很喜欢用Nginx来做WEB SERVER和Proxy,它真的很强大)当然还有一写直接就使用LUA来写的WEB SERVER,但考虑到LUA的Socket库不支持epoll,担心性能有问题。

  so~我就着手自己弄个LUA SERVER吧 ;) 下面是这个LUA SERVER的业务处理流程图:

lua-server

  最上级的还是Nginx,它的主要作用是负责负载均衡、访问过滤和静态文件访问等服务。接下来就是核心LUA SERVER,这里不仅是一个WEB SERVER,同时这也是一个LUA的WEB开发框架的核心,使用多进程和多线程互相配合的模式提供Server服务,里面还包括了MySQL的Connect pool和Memcache的Connect pool,pool 是JAVA开发里面经常用到的,但PHP就因为没有多线程,就无法实现。

  接下来的是一个Controller负责业务处理的调度。还包括一个Template engine(废话,WEB开发没一个好的模板引擎会很累的)

  剩余的就是WEB项目里面的业务处理程序咯,这没啥好说滴。我的经验是,这类代码最多使用的是 if、for和数据库操作之类的处理了。所以说要拿什么语言来开发WEB都行~能连数据库都搞定了。BASE语言也可以写CGI~囧~

  现在LUA SERVER的基础模型已经写好了,经过一些简单的压力测试,LUA的性能大概是PHP的1~2倍,很牛!我得尽快把它好好完善起来 :) 放到实际业务上。嘿嘿~完~