input output format - noradle/noradle-oracle-server GitHub Wiki

当前 noradle 在 oracle 侧接收的请求的数据格式是 noradle 格式, 他的主要设计考虑是

  • 请求头容易是用 oracle UTL_TCP API 读取
  • 响应头容易是用 node.js 分解以利用

由于将原始请求(http,websocket,fcgi,scgi) 要和 noradle 标准格式做转换,这个node.js进程就存在着处理消耗,现在考虑一下直接转发上述协议请求包到空间可用的oracle server process上,由 OSP 负责进行进一步的解析,这样可以充分利用oracle多进程处理,同时也基本上做到 node.js的最简化部署。

SCGI

SCGI 的格式非常适用于 oracle 读取

请求响应处理过程

  • noradle-dispatcher 可以开 SCGI 服务端口
  • nginx 接收到 http 请求,转换成 SCGI 连接发送请求消息到 noradle-dispatcher
  • noradle-dispatcher 选择空闲的 oracle 进程,将该 SCGI 消息转发
  • noradle-dispatcher 接受 oracle 的响应然后发送回 nginx

推荐部署方式

  • 在 nginx 本机部署 noradle-dispatcher
  • nginx 适用 unix domain socket 和 noradle-dispatcher 通信,通信处理损耗和延时降到最低
  • nginx 配置路由策略,不同的访问地址映射到不同的 noradle-dispatcher 从而访问不同的 oracle instance
  • nginx 可以添加变量,让 pl/sql servlet 可以获得更多需要的环境信息

oracle 分析请求中的麻烦

  • 确认 header 结束
  • header 条目切分
  • header name-value 切分
  • 重复 header 只留一条
  • form submit ( query string) 解析
  • JSON data 解析
  • post body
  • 上传文件,multipart 分割处理

node.js 除转发frame外可能需要做的处理

  • 从请求中找出 cookie id 值,根据他做 RAC/DG instance 路由,可以考虑在 nginx 上做路由
  • 根据 method 和 prog 类型,判断是否是只读请求,做 DG(primary/standby) 路由,浏览器应用可以通过js确保连接中非只读的改成显然用户确认然后再用post方式提交
  • 根据会话 cookie 值,添加会话信息到请求中。当然完全可以通过会话表实现,只是不能跨DB,通过 signed cookie 或 oauth 也能解决

可以看出,如果 dispatcher 一旦拆包,就需要理解和解析各种协议格式,变得复杂,负载加重。