正确认识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倍,很牛!我得尽快把它好好完善起来 :) 放到实际业务上。嘿嘿~完~

使用加密 cookie 代替 session 的应用方案

  在传统的网站应用中,我们会把一些相对敏感的用户信息保存在 session 中,目的就是为了避免这些敏感信息的意外泄漏,给用户带来不便。但要实现这个功能,我们却要付出比较昂贵的代价。比如单服务器的小型网站,session 占用文件系统或数据库资源,当然因为网站小,用户数量并不多,这个不会带来多大的问题。但如果对一个大型网站,过数万个用户同时在线的话,这个成本就非常大了,并且为了解决多服务器共享 session 的问题,还可能会使用数据库来保存 session 的数据,数万个在线用户的 session 可不是随便搞个数据库就可以抗起来的。

  其实在我们真实的互联网应用中,这部分的数据是否真的很敏感?这个值得大家思考。为了避免使用 session 所要花费的成本,我们可以考虑使用加密的 cookie 来代替。下面介绍一下我做的 cookie 共享方案:

 使用加密cookie代替session的应用

  从图中可以看到,我们为加密 cookie 专门提供了一个 XTea Server(Xtea是一个加密协议),其实它就是一个加密和解密字符串的服务程序,采用 TCP Socket 进行连接。

  因为网站会涉及到多种开发语言和多种应用,比如 PHP/Java 和 Flash 等常用的。为了实现大家的 cookie 共享,我们就需要专门提供这样一个 XTea Server 了。这样无论是什么语言或应用,只要它能够使用 Socket 连接,就可以很方便的共享cookie,比如 Flash 就有 XMLSocket,Flash 也可以很方便的读取浏览器上的 cookie。并且加密和解密都在我们的服务器后台,cookie 可被解密的可能性就降低了。

  当然实现 cookie 的加密共享只是重要的一环,另外我们还需要给 cookie 的数据定制一个数据结构标准,这里我建议大家使用 JSON 数据格式进行共享,因为 JSON 是可以方便的给 JavaScript 语言解析读取,并且现在流行的开发应用都支持 JSON 数据格式。(其实 XML 更广,但它的数据格式实现起来比较长,并不适合我们使用到 cookie 上)

  就是这样我们就已经实现了cookie 加密数据在多种应用中共享使用了。比如用户在网站上登录了,再进入我们的 Flash 应用,Flash 应用就可以直接把用户浏览器上的 cookie 发送到 XTea Server上解密,解读出用户信息了 :)

发挥你的思维,没有做不到的事情

在新的一年,Yo2 的服务器压力比以前大多了。为了能够提供快度的博客访问,我们使用了多种服务软件。比如 nginxsquidlighttpd等,这些在 linux 系统上的性能都是十分棒的 :) 不过我们还在追求更快、更高效率的解决方案。

我作为一个开发员,想法又特别的多 _-!! 居然想到自己写个 web server _-!! 汗~

有了想法当然必须做出行动 :) 立刻到网上查找相关资料,首先从英文网站出发(国外的开源项目多,并且代码都很好),逛了一整天,终于找到一个国人写的 epoll 代码模型。因为只是个模型,根本没有任何业务处理能力,这些就得自己写了 :) 花费2天 时间,就在这个基础模型上实现了 web server 功能。

yo2pagengine 终于面世 :) 不到 1000 行代码,当然还有很多功能没加进去,但已经可以实现基本的 web server 服务。

我使用了 siege web 服务压力测试软件,测试了一下 yo2pagengine 的性能。在 gdb 调试进程内服务,得出的成绩是每秒处理 150 个请求。我把该结果告诉了 charles 和一个熟悉 web 系统的网友,都觉得这个成绩很棒咯。呵呵,但这个数据只是我在 debug 模式测试出来的,真正的业务处理能力在下面:

$:siege -c 300 -r 100 -f oneoo.com.url (包含350个URL)

Transactions: 30000 hits
Availability: 100.00 %
Elapsed time: 83.53 secs
Data transferred: 217.47 MB
Response time: 0.07 secs
Transaction rate: 359.15 trans/sec
Throughput: 2.60 MB/sec
Concurrency: 25.49
Successful transactions: 30000
Failed transactions: 0
Longest transaction: 13.77
Shortest transaction: 0.00

处理能力达到每秒处理 360 个请求 !哇~这个成绩是在我自己的电脑上测试的,web server 和 siege 都开在同一个电脑上,还有 linux 效率比较低的 X (在我的电脑上,Vista 运行起来比它流畅多了,很不解,怎么人人都说它性能好)如果是在真正的服务器上使用,肯定不只这个成绩 :)

下面才是本文主要部分:

其实我也不熟悉C语言,只能算入门。但还是顺利实现了自己的需要的功能 :)

这么多的编程语言,人是不可能全都熟悉的,问题是人的思维是否灵活。

不要担心前路是否平坦,只有踏出了第一步,你才真正知道这条路的好坏,遇到什么问题,尽努力逐一解决,方可实现自己的目标。但如果你连第一步都无法踏出去,你连成功的机会都没了。