• 阿锋
    2019-08-17
    域名一般都是带www,也可以不带www,这两者有什么区别?www的作用是什么?

    作者回复: www是“主机名”,也就是表示这台主机用于提供万维网服务。

    但现在大部分互联网上的主机都是http服务器,所以www现在只是一个“历史习惯”了,比如极客时间的网站“time.geekbang.org”,虽然不是www,但也是http服务。

    不带www是域名的一种简化,通常会使用重定向跳转到其他的域名。

    
     5
  • 锦
    2019-08-16
    老师好,多路复用理解起来有点困难,主语是什么呢? 多路 复用分别怎么理解呢?

    作者回复: 英文是I/O multiplexing,就是指多个I/O请求“复用”到一个进程或线程里处理,而不是开多个进程、线程处理。

    可以看示意图再体会一下。

    
     5
  • 闫飞
    2019-08-19
    看起来OpenResty的核心武器是协程模型和Lua语言嵌入融合,合理照顾到了开发效率和程序执行效率之间的平衡。

    作者回复: 对。

    
     3
  • -W.LI-
    2019-08-16
    老师好!
    同步阻塞:代码同步顺序执行,等待阻塞操作完成继续往下走。
    同步非阻塞:代码顺序执行,遇见阻塞操作时,CPU执行世间会让出去,得到结果时通过callBack继续回到之前阻塞的地方。
    大概是这样么?
    然后就是同步阻塞的话,在阻塞的时候会占用CPU执行时间么?
    同步非阻塞的话,遇到阻塞操作,主线程直接让出CPU执行时间,上下文会切换么?上下文切换开销会很大吧,如果只是让出怎么实现阻塞数据没就绪时不被分配cpu,如果一直没回调这个线程会死锁么?
    代码中请求,redis,数据库这些操作是同步阻塞,还是同步非阻塞?

    展开

    作者回复:
    1.基本正确,但同步阻塞的时候是这个线程被阻塞了,操作系统会把这个线程切换出去干别的,不会耗cpu,相当于这个线程没有充分利用cpu给它的资源。

    2.同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。

    3.有超时机制,超时就会任务执行失败,不会死锁。

    4.OpenResty的代码都是同步非阻塞的。

    
     3
  • Geek_54edc1
    2019-08-16
    2、“阶段式处理”,我的理解这个与“流水线”很像,许多的业务流程模型其实都可以抽象为流水线,通过配置化的方法,可以定制化地把各个模块组成业务流水线

    作者回复: good

    
     2
  • 业余草
    2019-08-23
    老师不写OpenResty专栏亏才了

    作者回复: 可以看实体书《OpenResty完全开发指南》。

    
     1
  • -W.LI-
    2019-08-16
    老师好!看完回复好像明白了一点
    同步非阻塞:nginx,是单线程模型,主线程类似一个多路复用器(和NIO的IO模型类似?),所有的请求是以任务形式被受理,任务是交给协程程处理。任务结束,主线程检测到事件进行对应操作。主线程和协程一直都在处理任务,所以不会涉及到线程的上下文切换。传统的web服务器,Tomcat这些都是线程池形式的。一个请求交给一个线程,请求阻塞了这个线程就会被切换出去开销很大。nginx协程开销已经小了,又通过事件+异步非阻塞模型减少了上下文切换所以吞吐量就能很大。

    作者回复: 基本正确。不过Nginx里没有使用协程,它使用的是epoll的事件机制,向epoll注册socket的读写事件,当socket可读可写时调用响应的处理函数。

    你说的协程是应用在OpenResty的Lua虚拟机里。

    
     1
  • 许童童
    2019-08-16
    老师你好,可以说一下OpenResty 和 nginx njs 有什么区别吗?

    作者回复: OpenResty现在已经是一个成熟的Web开发生态体系了,已经有很多商业公司基于OpenResty开发各种业务应用,底层的LuaJIT性能很高,保证了它的运行效率。

    njs现在还是处于起步阶段,功能比较弱,Nginx对它的定位是“可编程配置语言”,关注点还是在辅助Nginx,而不是用来开发复杂的业务逻辑。

    还有很重要的一点是OpenResty里的LuaJIT支持FFI,可以直接调用C接口,扩展性极高,而njs这方面的能力为零,只能限制在vm里。

    
     1
  • 许童童
    2019-08-16
    谈一下这些天你对实验环境里 OpenResty 的感想和认识。
    我感觉有些时候,写代码比写配置文件更加灵活,OpenResty 通过Lua脚本就可以达到这个效果。

    你觉得 Nginx 和 OpenResty 的“阶段式处理”有什么好处?对你的实际工作有没有启发?
    阶段式处理,有点类似一个类的生命周期,又有点类似责任链模式。实际工作中编写前端组件,也可以采取类似的方式,把组件渲染分阶段,生命周期细分,使组件更专注更内聚。
    展开

    作者回复: 说的挺好。

    其实Nginx最初的模块设计就是想把配置文件弄成语言的形式,通过模块实现指令来增加语言里的词汇,但Nginx的配置文件修改后必须重启,而且C模块开发太麻烦。

    OpenResty引入Lua后C模块开发的就越来越少了,因为脚本语言比简单的指令更灵活,开发的成本也更低。

    
     1
  • Jeff.Smile
    2020-01-20
    也可能是nginx已经解决了大部分的问题,openresty对很多公司并没有体现出相比nginx的优势,导致用不起来,不是很流行,大家都知道nginx,但是未必都知道openresty。

    作者回复: openresty在CDN等领域用的还是很多的,很多大公司也在用,比如阿里京东。

    
    
  • Flourishing
    2019-12-27
    老师,既然OpenResty这么厉害,为什么现在大部分公司还是用的Nginx啊?我公司都有Lua程序员,但是Web服务器还是用的Nginx。是不是学习和运维成本都挺高的啊?

    作者回复: OpenResty出来的比较晚,而且在最近几年才开始商业化推广,自然要比Nginx的市场份额要少一些,相关的资料也少,不过最近OpenResty的市场占有率已经开始快速增长了。

    OpenResty其实就是Nginx加上一些非常有用的开发组件,本质上还是Nginx,但开发起来更方便。但因为它多了Lua等其他东西,功能已经不再是单纯的web server,所以用起来要复杂一点。如果是单纯搭建网站,没有二次开发的需求,自然很多人会出于简单的目的选择Nginx,但我觉得选择OpenResty会更好,更有潜力。

    
    
  • 👻 小二
    2019-08-23
    多路复用, 这种是需要操作系统底层提供支持吗?感觉自己的代码再怎么写, 也是多开一个线程在那边等,

    作者回复: 目前是这样,需要操作系统底层有epoll、kqueue等系统调用,然后基于这些系统调用实现reactor、proactor等模式,也就是多路复用。

    
    
  • 彩色的沙漠
    2019-08-22
    老师您在一个同学回复中说“同步阻塞的时候是这个线程被阻塞了,操作系统会把这个线程切换出去干别的,不会耗cpu,相当于这个线程没有充分利用cpu资源”,安卓系统用的单线程模型,如果主线程阻塞超时,就会报ANR

    作者回复: Android系统不了解,欢迎补充。

     1
    
我们在线,来聊聊吧