HI,章亦春 && 各位
目前在开发自定义module与其他服务进行通信过程中,在思路方面遇到一些问题,向大家请教,希望得到帮助。
场景描述:提供一个ImageServer服务,公开TCP5000端口,接收来自客户端的TCP连接,提供根据 图片Url 获取图片字节流的服务
示意图如下:
解释:1. 用户通过浏览器请求 Nginx 80
2. Nginx 80进程接收到客户端请求后,访问上游服务器 Nginx 8012进程,获取指定Uri执行压缩后的图片内容
3. Nginx 8012内部提供了自定义module,计划通过tcp socket与 ImageServer 5000端口进行非阻塞通信,获取给定Uri的
原始图片字节流4. 之后 在Nginx 8012 内部继续进行压缩并返回Nginx 80,Nginx 80再返回客户端,完成一次完整的图片请求。
疑惑:在自定义module与第三方系统进行非阻塞通信实现思路上,遇到以下几个问题
与ImageServer的通信,不想再使用http协议,想直接通过tcp协议,将图片地址发送,并获取图片字节内容。
1. 与ImageServer进行通信实现,是否还有其他的办法?目前计划的做法:
与ImageServer进行通信时,从可用连接池中拿到一个新的connection对象,创建与ImageServer通信的socket,并组织二者的关系(计划在新connection对象上任然使用r代表当前请求),但在这种情况下,该如何保证 Nginx 80 与 Nginx 8012建立的连接对象的写事件执行时,必须是 新Connection对象与ImageServer通信结束后(超时或正常完成) 。
2. 由于Nginx 80 到 Nginx 8012 的一次http请求可能会多次epoll调度才执行完毕,新Connection对象与ImageServer通信的代码是否会多次执行?由于ngx_http_core_run_phases可能多次执行,而与第三方进行通信的代码是在自定义module中,如何保证其不会被多次执行,这个需要自己维护状态吗(即便多次执行,每次也要接着上次执行最后的地方继续执行)?
由于与第三方通信是使用新的连接。原有Connection和Request上的写事件handler在执行自定义module与第三方通信时,是否需要修改?
nginx代码中,在ngx_http_process_request 方法 和 ngx_http_handler方法中设置的handler
ngx_http_process_request :
//其中c是 Nginx 80 与 Nginx 8012建立的连接
//r 代表 Nginx 80 与 Nginx 8012建立的连接上的http请求对象
c->read->handler = ngx_http_request_handler;
c->write->handler = ngx_http_request_handler;
r->read_event_handler = ngx_http_block_reading;
ngx_http_handler:
//r 代表 Nginx 80 与 Nginx 8012建立的连接上的http请求对象
r->write_event_handler = ngx_http_core_run_phases;
关于这块的实现,有点混乱,希望得到大家的指点,不胜感激。