nginx的源代码分析--间接回调机制的使用和类比
nginx使用了间接回调机制。结合upstream机制的使用来说明一下,首先明白几个事实:
1)事实上ngxin和下游client的连接使用的是ngx_http_connection_t,每一个连接相应着一个读事件、一个写事件,epoll监听队列监听的是事件(ngx_event_t),可是事件的data字段相应于这个事件所属的连接(ngx-connection_t)。可是nginx和上游server之间的连接使用的ngx_peer_connection_t。事实上ngx_peer_connection_t是ngx_connection_t结构体的封装,前者包含了后者。算是后者的高级应用
2)ngx_connection_t相应nginx和client的连接。每一个这种连接都有一个请求(ngx_http_request_t)与之相相应。同一时候请求中有连个字段,write_event_handler和read_event_handler,这连个字段属于请求的读写回调,可是他非常显然不能被激活,能激活的就是读写事件(ngx_event_t)
3)在HTTP请求的后期阶段,nginx通过连接上的读写事件回调(这个已经被epoll监控)来间接调用请求上的读写回调。这么一来,假设想该变请求上的流程。仅仅须要改动
ngx_http_request_t上的read_event_handler和write_event_handler就可以。这种实现能够在ngx_http_handler函数中体现
4)nginx在处理upstream和上游的连接时,每个upstream连接(ngx_peer_connection_t)相应一个upstream机制(ngx_http_upstream_t)。由于upstream的连接也能够看成ngx-connection_t,所以和ngx_connection_t类似,ngx_http_upstream_t中也有两个字段read_event_handler和write_event-handler,这样在处理和上游的连接上的读写回调时也是间接调用了ngx_http_upstream_t的读写回调函数
这个在ngx_http_upstream_connection中能够看到 c=u->peer.connection。这里的c(ngx-connection_t)是和上游server之间的连接
c->write->hanlder = ngx_http_upstream_handler,在这一行和接下来的几行。认真阅读,会发现ngx_http_upstream_handler和ngx_http_handler有相似之处
5)这么一来,在接下来的处理中仅仅需关注ngx_http_upstream_t上的读写(write_event_handler & read_event_handler)就可以完毕nginx和上游server之间的交互,仅仅需关系ngx_http_request_t中的读写(write_event_handler & read_event_handler)就可以完毕nginx和client之间的监护
(总结:在连诶http请求和经过upstream机制的请求时,一定要明确当前的ngx_connection_t是指nginx和谁之间的连接)
nginx的源代码分析--间接回调机制的使用和类比的更多相关文章
- Android源代码分析-资源载入机制
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 我们 ...
- nginx源码分析:module机制
根据nginx官方文档,添加一个module的介绍,当我们需要添加一个module时,需要以下操作: 1.为该module新建一个目录. 2.添加一个config文件,一个module核心代码源文件. ...
- Memcached源代码分析 - Memcached源代码分析之消息回应(3)
文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析 ...
- nginx源代码分析--进程间通信机制 & 同步机制
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...
- hostapd源代码分析(二):hostapd的工作机制
[转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...
- Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...
- Nginx源代码分析—业务流程
Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...
- Android 中View的绘制机制源代码分析 一
尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...
- Java提高篇——通过分析 JDK 源代码研究 Hash 存储机制
HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实 ...
随机推荐
- 刷题总结——生日礼物(bzoj1293单调队列)
题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠, ...
- linux上部署thinkphp5提示500
解决方法一:LNMP 1.4上也可以直接使用lnmp1.4/tools/ 目录下的 ./remove_open_basedir_restriction.sh,输入网站的全路径(如/www/wwwroo ...
- TYVJ 1305 最大子序和 ++ 烽火传递
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- MySQL 5.7.17绿色版安装
下载地址 :https://dev.mysql.com/downloads/mysql/ ,需要oracle帐号 下载 Windows (x86, 64-bit), ZIP Archive 是个 ...
- Using a USB host controller security extension for controlling changes in and auditing USB topology
Protecting computer systems from attacks that attempt to change USB topology and for ensuring that t ...
- 在 POSIX 线程编程中避免内存泄漏
检测和避免 POSIX 线程内存泄漏的技巧 POSIX 线程(pthread)编程定义了一套标准的 C 编程语言类型.函数和常量 — 且 pthreads 提供了一种强大的线程管理工具.要充分使用 p ...
- Echarts-之显示百分比
对于使用echarts要显示百分比,要改两个地方,第一个地方时坐标轴显示为百分比的格式,第二个是让值以百分比的形式显示,如50,在图上面显示为50%. yAxis: [ { type: 'value' ...
- 2017 CCPC 哈尔滨站 题解
题目链接 2017 CCPC Harbin Problem A Problem B Problem D Problem F Problem L 考虑二分答案. 设当前待验证的答案为x 我们可以把第二 ...
- luogu P1057 传球游戏
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- String,StringBuffer,StringBuilder源码分析
1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...