Home - noradle/noradle-fcgi GitHub Wiki

FastCGI frame 组成和 noradle 比较

  • version: noradle frame 没有 version,但是 noradle 打算在握手信息中增加 version,确保各个通信节点直接协议版本兼容
  • type: frame 类型,noradle 有,head/body/end,响应额外还有 session。
  • request ID: noradle 对应有 slot ID,只标识在途中的请求,处理完的包括异常的请求不占用ID
  • padding 相关:noradle 目前没有 padding 信息,因为还不能证明存在 padding 处理会更快
    • We recommend that records be placed on boundaries that are multiples of eight bytes

noradle-dispatcher 提供 FCGI 服务

其实 noradle client 和 noradle-dispatcher 之间的通信就类似 fastCGI 协议, 如果 noradle-dispatcher 就能够接受 fastCGI协议的请求,并转发到 oracle 中,就能成为标准de fastCGI 应用服务器。

  • 为新的 request ID 分配 oSlotID,或者 FCGI request ID 就是 oSlotID
  • 相同 request ID 下的后续包,发送到绑定好的 oSlotID
  • oracle 侧可以读取一个 request ID 下先后不同类型的请求包格式
    • 包括 version, type, req id, padding 等等

FCGI 协议下的用于能力协商管理包

  • FCGI_MAX_CONNS: The maximum number of concurrent transport connections this application will accept, e.g. "1" or "10".
  • FCGI_MAX_REQS: The maximum number of concurrent requests this application will accept, e.g. "1" or "50".
  • FCGI_MPXS_CONNS: "0" if this application does not multiplex connections (i.e. handle concurrent requests over each connection), "1" otherwise.

具体在 noradle-fcgi 上的配置应该有两套;

第一套:多路复用

node.js 实现上和 noradle-dispatcher 非常的像

  • FCGI_MAX_CONS:1 因为 node.js 应用只要监听一个端口即可
  • FCGI_MAX_REQS:n 直接设置成 dispatcher 给予的最大连接数即可
  • FCGI_MPXS_CONNS:1 代表接受多路复用

第二套:不用多路复用

node.js 实现接受多个连接,每个连接同时只接受一个请求的数据,cSlotID就是连接号(从1依次往下排,并复用)

  • FCGI_MAX_CONS:n 直接设置成 dispatcher 给予的最大连接数即可
  • FCGI_MAX_REQS:n 直接设置成 dispatcher 给予的最大连接数即可
  • FCGI_MPXS_CONNS:0 代表接受多路复

非多路复用,多条链路,每条链路无并发模式的快速路由方法

(注:这里的 nginx 泛指如 nginx 的支持 fast CGI 协议的 web server)

  • noradle-fcgi 接受多个 oracle server process 的反向连接(当然有握手过程,通 noradle-dispatcher 完全一样)
  • nginx 建立多个到 noradle-fcgi 的连接
  • noradle-fcgi 将每个 nginx 连接绑定一个空闲的 oracle 连接,并且一直保持
  • nginx 发送的 app level 请求直接转发到绑定的 oracle 连接上
  • oracle 的响应直接转发到绑定的 nginx 到 noracle-fcgi 连接上

采用这种方式,请求到oracle通道的派发最为简单高效,就好像 nginx 直接连接到多个 oracle server process 上。

     (multiplexed or not)               (utl_tcp)
. nginx  ===========>  noradle-fcgi  <----------  oracle processes
                     (node.js|python)                  (oracle)
                             ^
.                      monitor/console