35 | OpenResty:更灵活的Web服务器
35 | OpenResty:更灵活的Web服务器
讲述:Chrono
时长11:21大小12.98M
OpenResty 是什么?
动态的 Lua
高效率的 Lua
阶段式处理
小结
课下作业
赞 12
提建议
精选留言(21)
- 锦2019-08-16老师好,多路复用理解起来有点困难,主语是什么呢? 多路 复用分别怎么理解呢?
作者回复: 英文是I/O multiplexing,就是指多个I/O请求“复用”到一个进程或线程里处理,而不是开多个进程、线程处理。 可以看示意图再体会一下。
24 - 闫飞2019-08-19看起来OpenResty的核心武器是协程模型和Lua语言嵌入融合,合理照顾到了开发效率和程序执行效率之间的平衡。
作者回复: 对。
12 - 阿锋2019-08-17域名一般都是带www,也可以不带www,这两者有什么区别?www的作用是什么?
作者回复: www是“主机名”,也就是表示这台主机用于提供万维网服务。 但现在大部分互联网上的主机都是http服务器,所以www现在只是一个“历史习惯”了,比如极客时间的网站“time.geekbang.org”,虽然不是www,但也是http服务。 不带www是域名的一种简化,通常会使用重定向跳转到其他的域名。
12 - -W.LI-2019-08-16老师好! 同步阻塞:代码同步顺序执行,等待阻塞操作完成继续往下走。 同步非阻塞:代码顺序执行,遇见阻塞操作时,CPU执行世间会让出去,得到结果时通过callBack继续回到之前阻塞的地方。 大概是这样么? 然后就是同步阻塞的话,在阻塞的时候会占用CPU执行时间么? 同步非阻塞的话,遇到阻塞操作,主线程直接让出CPU执行时间,上下文会切换么?上下文切换开销会很大吧,如果只是让出怎么实现阻塞数据没就绪时不被分配cpu,如果一直没回调这个线程会死锁么? 代码中请求,redis,数据库这些操作是同步阻塞,还是同步非阻塞?展开
作者回复: 1.基本正确,但同步阻塞的时候是这个线程被阻塞了,操作系统会把这个线程切换出去干别的,不会耗cpu,相当于这个线程没有充分利用cpu给它的资源。 2.同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。 3.有超时机制,超时就会任务执行失败,不会死锁。 4.OpenResty的代码都是同步非阻塞的。
8 - 业余草2019-08-23老师不写OpenResty专栏亏才了
作者回复: 可以看实体书《OpenResty完全开发指南》。
6 - djfhchdh2019-08-162、“阶段式处理”,我的理解这个与“流水线”很像,许多的业务流程模型其实都可以抽象为流水线,通过配置化的方法,可以定制化地把各个模块组成业务流水线
作者回复: good
4 - Aemon2021-03-10nginx reload不影响应用吧?秒级是认真的吗?
作者回复: 我曾经见过一个Nginx实例重启,要加载几百几千个配置文件,那速度……
3 - 钱2020-04-05同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。 老师,这块没太明白,同步和非阻塞原本是矛盾的,一个大动作由多个小动作组成,如果其中一个小动作是一个慢动作,而且是同步模式,下面的动作必然会被阻塞住吧? 你上面解释说“线程自己主动切换CPU给其他任务”, 1:那线程什么时候主动切换CPU给其他任务? 2:这里的其他任务指什么? 3:线程主动切换CPU给其他任务后处于什么状态?为什么? 5:还有我的假设中慢动作后面的动作不是被阻塞了吗? 6:还是说维度与层次不同,同步非阻塞的主体是线程,而不是线程中的一系列动作?展开
作者回复: 1.协程只是同步非阻塞的一种实现方式,两者不完全等同。 2.OpenResty里的线程其实是协程,内部有调度器,当有阻塞的时候就切换到其他的协程(任务)去执行。 3.协程主动yield后就出于暂停状态,可以随时切换回来继续执行,所以它自己是阻塞的,但整个程序不会因为一个协程而被阻塞。 4.可以参考其他语言里的协程概念来理解。记住协程是用户态的线程,而在操作系统来看实际上只要一个线程,所以如果有大量的磁盘io那么必然会阻塞。
3 - 许童童2019-08-16老师你好,可以说一下OpenResty 和 nginx njs 有什么区别吗?
作者回复: OpenResty现在已经是一个成熟的Web开发生态体系了,已经有很多商业公司基于OpenResty开发各种业务应用,底层的LuaJIT性能很高,保证了它的运行效率。 njs现在还是处于起步阶段,功能比较弱,Nginx对它的定位是“可编程配置语言”,关注点还是在辅助Nginx,而不是用来开发复杂的业务逻辑。 还有很重要的一点是OpenResty里的LuaJIT支持FFI,可以直接调用C接口,扩展性极高,而njs这方面的能力为零,只能限制在vm里。
3 - dahai2020-09-06Nginx 的服务管理思路延续了当时的流行做法,使用磁盘上的静态配置文件,所以每次修改后必须重启才能生效。 Nginx 有reload 命令,只是不是自动reload。
作者回复: reload要读取磁盘文件,而配置文件复杂的话这就有一定的成本,而且重启进程的消耗也是不容忽视的。
2 - lesserror2019-12-27老师,既然OpenResty这么厉害,为什么现在大部分公司还是用的Nginx啊?我公司都有Lua程序员,但是Web服务器还是用的Nginx。是不是学习和运维成本都挺高的啊?
作者回复: OpenResty出来的比较晚,而且在最近几年才开始商业化推广,自然要比Nginx的市场份额要少一些,相关的资料也少,不过最近OpenResty的市场占有率已经开始快速增长了。 OpenResty其实就是Nginx加上一些非常有用的开发组件,本质上还是Nginx,但开发起来更方便。但因为它多了Lua等其他东西,功能已经不再是单纯的web server,所以用起来要复杂一点。如果是单纯搭建网站,没有二次开发的需求,自然很多人会出于简单的目的选择Nginx,但我觉得选择OpenResty会更好,更有潜力。
2 - -W.LI-2019-08-16老师好!看完回复好像明白了一点 同步非阻塞:nginx,是单线程模型,主线程类似一个多路复用器(和NIO的IO模型类似?),所有的请求是以任务形式被受理,任务是交给协程程处理。任务结束,主线程检测到事件进行对应操作。主线程和协程一直都在处理任务,所以不会涉及到线程的上下文切换。传统的web服务器,Tomcat这些都是线程池形式的。一个请求交给一个线程,请求阻塞了这个线程就会被切换出去开销很大。nginx协程开销已经小了,又通过事件+异步非阻塞模型减少了上下文切换所以吞吐量就能很大。展开
作者回复: 基本正确。不过Nginx里没有使用协程,它使用的是epoll的事件机制,向epoll注册socket的读写事件,当socket可读可写时调用响应的处理函数。 你说的协程是应用在OpenResty的Lua虚拟机里。
2 - 许童童2019-08-16谈一下这些天你对实验环境里 OpenResty 的感想和认识。 我感觉有些时候,写代码比写配置文件更加灵活,OpenResty 通过Lua脚本就可以达到这个效果。 你觉得 Nginx 和 OpenResty 的“阶段式处理”有什么好处?对你的实际工作有没有启发? 阶段式处理,有点类似一个类的生命周期,又有点类似责任链模式。实际工作中编写前端组件,也可以采取类似的方式,把组件渲染分阶段,生命周期细分,使组件更专注更内聚。展开
作者回复: 说的挺好。 其实Nginx最初的模块设计就是想把配置文件弄成语言的形式,通过模块实现指令来增加语言里的词汇,但Nginx的配置文件修改后必须重启,而且C模块开发太麻烦。 OpenResty引入Lua后C模块开发的就越来越少了,因为脚本语言比简单的指令更灵活,开发的成本也更低。
2 - ifelse2023-02-06 来自浙江都是硬货
作者回复: nice
1 - 山青2022-06-25这个跟Nginx+lua 感觉跟 Golang的思想有点像啊、
作者回复: 现代语言都是互相学习借鉴。
- 青鸟飞鱼2022-04-01老师,请教一个openresty的问题,实现一个主worker向rabbitmq发送消息,在其他worker将消息发送给主worker,由主worker保持tcp连接。在init_worker_by_lua_block阶段用的定时器ngx.timer.at(0, handler)处理tcp连接,同时在这里注册回调函数,回调函数里发送数据,但是回调函数里面的连接却失效了?怎么回事呢?
作者回复: 没在openresty里用过rabbitmq,感觉问题比较复杂,不是在这里回复能够解决的,抱歉了。
- shk12302022-03-01epoll 和协程有什么关系?
作者回复: 没有直接的关系。 epoll是操作系统的多路复用,而协程的编程语言里的范式,而openresty把这两者结合了起来。
- 功夫熊猫2021-10-30io口多路复用和多线程是我拿c写网络编程用的最多的方法。
作者回复: 现在这个是Linux里的通用做法了,不过在20年前可不是那么容易的。
- J.Smile2020-01-20也可能是nginx已经解决了大部分的问题,openresty对很多公司并没有体现出相比nginx的优势,导致用不起来,不是很流行,大家都知道nginx,但是未必都知道openresty。
作者回复: openresty在CDN等领域用的还是很多的,很多大公司也在用,比如阿里京东。
- 👻 小二2019-08-23多路复用, 这种是需要操作系统底层提供支持吗?感觉自己的代码再怎么写, 也是多开一个线程在那边等,
作者回复: 目前是这样,需要操作系统底层有epoll、kqueue等系统调用,然后基于这些系统调用实现reactor、proactor等模式,也就是多路复用。