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和谁之间的连接)

转载于:https://www.cnblogs.com/liguangsunls/p/6802003.html

nginx的源代码分析--间接回调机制的使用和类比相关推荐

  1. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  2. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  3. 通过分析 JDK 源代码研究 Hash 存储机制

    http://www.ibm.com/developerworks/cn/java/j-lo-hash/ 通过分析 JDK 源代码研究 Hash 存储机制 HashMap 和 HashSet 是 Ja ...

  4. 通过分析 JDK 源代码研究 Hash 存储机制--转载

    通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象 ...

  5. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  6. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  7. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析(2)...

    注意,这里的参数reply = 0,表示这是一个BC_TRANSACTION命令.         前面我们提到,传给驱动程序的handle值为0,即这里的tr->target.handle = ...

  8. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  9. binder 从c到java_Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析...

    在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码.细心的读者会发现,这几篇文章分析的Binder接口都是 ...

  10. Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)

    上一篇文章简单介绍了Android的回调机制的使用,这一篇博文将重点介绍Fragment碎片与activity的数据交互,fragment在Android开发中起着至关重要的作用,通过官方Androi ...

最新文章

  1. Linux防止SSH暴力破解
  2. 长寿即服务:创业公司如何用AI技术颠覆传统药物研发
  3. 1、在Centos上安装Grafana
  4. ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架
  5. DNN结构演进History—CNN( 优化,LeNet, AlexNet )
  6. 怎么在linux操作python_pythonlinux怎么操作
  7. java面向对象使用字符串_java面向对象中的String类中12种常用的方法
  8. Struts2——namespace、action、以及path问题
  9. 算法练习一:求最小公倍数
  10. 排序二叉树 SortBinaryTree
  11. python docx创建表格
  12. 如何使用计算机网络打印机,电脑怎么连接网络打印机 网络打印机连接方法
  13. python docx_python-docx 入门
  14. 【前端作业系列】HTML基础点 , 训练<有序列表><无序列表>(2022年6月15日作业)
  15. 新时达电梯服务器维修,常见的新时达电梯维修时问题分析
  16. Sam-ba 2.12在win7上的安装
  17. Auto.js加密解密|快照Snapshot解密|Dex转js|Auto.js庖丁下载|解除APP限制
  18. inaturalist昆虫数据集
  19. 北纬三十度“神命谷”旅游策划方案
  20. 个子矮s弯如何看点打方向图解_s弯如何看点打方向盘

热门文章

  1. 微信小程序-跟学笔记
  2. 【Java程序设计】接口与多态
  3. flink知识点总结
  4. kafka 查看消费者组
  5. scala Map入门到熟悉
  6. Hive sql语句必练50题
  7. Windows核心编程_重绘ListBox样式(仿QQListBox)
  8. 微信小程序 --- 音乐的播放和控制
  9. 细说PHP:人人都能玩转PHP和MySQL Web开发
  10. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用6