Skip to content
kaven276 edited this page Jan 11, 2016 · 14 revisions

Welcome to the noradle-dispatcher wiki!

大纲

          (multiplexed)               (utl_tcp)
. clients  ===========>  dispatcher  <----------  oracle processes
 (node.js)                (node.js)                  (oracle)
                             ^
.                      monitor/console

核心功能

  • 提供客户端连接 oracle db 的通道,以反向接受 oracle server process 反向连接注册为基础
  • 为客户端提供虚拟的指定并发数的到 oracle 的连接(多路复用,并增强管理信息交换)

限制性设计原则

  • 因为处于网络中心位置,其性能、稳定性要求非常高
  • 由于保持转发状态(一个请求的中间状态),并且为简化设计,不支持集群,必须单进程来提供海量frame转发
  • 功能单一:就是提供一个客户端到oracle的网络通道,额外的集中提供监控数据源(比从其他类型节点提供要方便、集中)
  • 只有握手过程使用 http 协议,建立通道后,直接使用简单高效的内部 frame 协议通信
  • 除了管理包,不解析,不生成应用 frame 的内容体,只看标准的固定长度的 frame 头,用于 frame 在 client/oracle 间的转发

增强

  • 网络增强
    • 不直接通过 TCP 建立私有的握手过程,而是通过 http 协议握手,然后 upgrade connection
    • 支持 https 接入,提供通信安全性,端到端的相互认证
    • 可以通过 node.js/nginx 等常用代理来反向代理内部的 noradle-dispatcher
  • 健壮性
    • 支持端到端 ping/pong 包,用于保持中间带状态网元(如防火墙NAT转换状态)、心跳检测
    • 支持端到端的 graceful quit 信号处理,确保在途请求处理完毕才最终退出
  • 配置增强
    • client/oracle/console 向 noradle-dispatcher 的认证提供标准接口,供定制实现认证和授权策略
    • 提供标准化的配置格式,实现上述认证和授权,方便使用
  • 监控增强
    • 可以将完整的时间声名周期通过日志输出
    • 可以将上述日志输出改为向 console 实时输出,并由 console UI 实时监控
  • in-process client
    • noradle client 进程直接 require noradle-dispatcher
    • 节省一层网络中转,client 独占一组oracle服务进程
  • 直接接入 http 网关

和 oracle 网络架构比较

noradle-dispatcher 更像是 oracle listener 而不是 oracle dispatcher

每个 oracle db instance 启动后,会自动向 LOCAL_LISTENER 参数指定地址的 oracle listener 注册器服务, 这样当有客户端连接 listener,listen 就可以将TCP句柄转移给 oracle instance 中的服务进程。

noradle 启动 db server processes 后,各个进程也是向 noradle-dispatcher 注册自己。

区别在于,oracle 是数据库实例向 listener 注册,而 noradle 是每个对应组的服务进程向 noradle-dispatcher 注册。

1 serve 1, 1 serve n

  • oracle dispatcher 只服务于一个 db instance,并且属于该 db instance
  • noradle dispatcher 可以服务于多个 db instance,可以是一个 db 的(RAC/DG),也可以是不同的

server process share 不同

  • oracle 下,一个 dispatcher 接受的请求可以被所有的 share server process 处理
  • noradle 下,一个 noradle-dispatcher 独占一组 noradle server process,之间不共享,用于不同应用不同业务负载的隔离切分

Roadmap 路线图

  • 日志提升
    • log (debug based) log should classified more clear
    • 对于日志输出,分类要更加精细,容易从日志中看出系统运行过程。
    • 同时,日后可以将日志改成事件流,在 noradle-console 中实时查看。
  • 支持 https
    • client can make security connection to noradle-dispatcher
    • prevent password leakage
    • encrypt transport data
    • prevent middle proxy to see the exchanged data between client and dispatcher, allow http tunnel only
  • can serve behind proxy
  • keep-alive to sustain TCP(NAT) state
    • for oracle, client, console(realtime data)
  • configuration
    • use oracle's configuration data
    • only config http/https ports
  • support multiple db instances
    • all oracle connection from one db instance one cfg_id will incorporate into one pool
    • statistics should bring into pool, not global data
  • 参考 websocket 协议,拿来器优点
    • 大的 frame 分片,防止传输被一个请求独占,不过 noradle 已经将上传文件留下不发往db,因此意义不是很大
    • Opcode:4位操作码,包括 text/binary/ping/pong/close,这个 noradle 已经引用 frame type,而且 slotID=0 代表管理包 ping/pong/quit
    • payload length 不定长,noradle 是定长4个字节,对于单个 frame 2G/4G 足够用了。