• 深入浅出 nginx lua 为什么高性能


    最近很多人问我nginx lua的优势是什么?为什么?

    一、同步和异步、阻塞和非阻塞

    如果要说清楚这个问题首先要了解:同步和异步、阻塞和非阻塞的关系

    1. 同步:php、java的正常代码都是同步执行的
    2. 异步:javascript的回调函数就是异步的

    说白了自己写的程序里面如果没有回调函数都是同步的,常见的php、python等语言少有异步代码,当前大量使用异步代码的有javascript。

    1. 阻塞:查询数据库或者读写文件,如果没有获取结果就一直等待,说明是阻塞的。
    2. 非阻塞:执行之后立刻返回是非阻塞的

    比如:nginx的模块调用,程序请求了一个读数据库的操作,然后该干嘛干嘛,等到读取结果返回之后,再做剩下的事情。

    二、nginx的非阻塞模型

    很多人分不清楚异步和非阻塞的区别,按照我的理解主要是主体不同,异步指的是自己写的程序是否有类似回调函数的功能,而非阻塞指的是nginx主体调用读写操作,当数据库没有返回结果的时候,不影响其他的用户请求。

    由于咱们使用的是lua,使用这个脚本语言大多场景也是同步的,很好理解,所以咱们主要说一下nginx-lua如何实现非阻塞的。其实非阻塞的功能使用nginx实现的,基本与lua无关,那么nginx如何实现非阻塞的哪?

    一般的web服务器都是建立在tcp请求基础之上的非阻塞事件模型,例如:

    比如咱们使用tomcat服务器或者apache服务器处理一个请求,肯定是建立一个线程或者进程中完成并返回给服务器

    那么nginx则不然:

    他把请求分成了几个阶段,每个阶段由不同的模块来处理,这样就实现了更全面的非阻塞处理http请求

    三、性能

    上面分析完了基本的原理,那么为何么nginx-lua的性能由于nginx-php哪?如果并发数量不高,那么两者其实没什么区别,只有并发数量上来之后,由于lua运行时占用内存特别少,放入了nginx模块内部,可以最大限度的承接nginx提供的非阻塞功能,只要后端数据库io跟的上,那么nginx-lua就能并发处理很多请求,更详细的原因可以参考王晓哲的分析文章:http://developer.51cto.com/art/201207/350070.htm

  • 相关阅读:
    JVM系列一:虚拟机内存区域
    【转载】 mybatis入门系列四之动态SQL
    mybatis入门系列三之类型转换器
    mybatis入门系列二之输入与输出参数
    mybatis入门系列一之创建mybatis程序
    SpringBoot基础系列一
    如何阅读W3C标准.md
    wget下载豆瓣图片失败
    js中调用worker工程化结构
    linux下fastboot工具使用异常
  • 原文地址:https://www.cnblogs.com/liqiu/p/4591887.html
Copyright © 2020-2023  润新知