作者回复: 对的
作者回复: 这里的connect不是nginx中调用linux的connect方法,在linux的connect方法中是立刻返回的(非阻塞socket),而通过epoll_ctl会把这个socket加入epoll中,当上游返回连接建立成功或者超时后,nginx会通过lua语言的ffi,去返回client:connect方法,所以,if肯定会执行的。
作者回复: 不是轮询,是等通知。
其他理解是对的。
作者回复: 阻塞与非阻塞是在低层次中展开的,通常针对的是API,同步与异步是在高层次中展开的,针对的更多的框架。
作者回复: 正确!
作者回复: 第6部分课程有介绍哦,参见openresty部分关于cosocket的大约倒数第5课
作者回复: 调用了connect方法,只是开始连接上游服务,此时会向上游发送SYN,等待上游回ACK+SYN,这样才算建立起TCP连接。但由于上游进程、操作系统、网络等原因都可能造成收不到ACK+SYN,所以connect会返回失败
作者回复: 是的,类似协程。
作者回复: 异步开发意味着你需要去处理非阻塞接口,同步开发意味着你只需要串行调用接口实现业务,不需要关注它究竟是阻塞还是非阻塞. 这两种方式都可以用非阻塞接口实现。
作者回复: 是的,这个协程其实是用nginx的事件驱动机制实现的
作者回复: nginx返回connect的结果时,就是执行下面代码的时候。nginx什么时候返回connect结果时呢?1、对端地址压根不存在,立刻返回;2、过了几毫秒对端返回成功或者失败;3、过了几秒到达了connect的超时时间。