A brief introduction to Noradle (Chinese Version)

kaven276 edited this page Jun 21, 2012 · 1 revision

Welcome to the noradle wiki!

<style>p{text-indent:2em;line-height:1.5em;letter-spacing:2px;}</style>

Oracle 是特性最为完整、功能最为先进、运行最为稳定、使用最为广泛的关系型数据库,PL/SQL 使得 oracle 在提供基本的 sql access 的基础上,支持应用逻辑的开发,PL/SQL 是最接近数据的编程语言,其存储过程形态使得 PL/SQL 成为数据操作密集型应用的首选。

NodeJS 是做网络应用的最为前沿的平台。综合了 javascript 的灵活性(类型绑定到值或动态类型、闭包、事件模型、基于原型的继承)和 NodeJS 平台的应用平台特性(模块管理、包管理、网络和文件API、无阻塞I/O), NodeJS 具有无与伦比的网络开发能力,可以轻松的实现各种基于TCP/UDP的网络协议的客户端和服务器端,并且具有高并发低延迟的普遍特性。

虽然 Oracle 和 NodeJS 都是各自领域的佼佼者,但是它们也有不足和需要完善的地方,而将两者通过 Noradle 结合,就可以将这两个完全互补的平台取长补短,形成更为强大和全面的平台。具体的问题和结合点有三个,分为论述如下:

一、PL/SQL 可以轻松的掌控 Oracle DB 的数据,而一般基于web的信息系统,其页面和处理器所做的往往就是将数据从表中读出然后嵌到页面中或者是将提交的数据写入到库表中。如果可以将 http 请求映射到 PL/SQL 存储过程,并且将 http 请求信息 (request line, headers, parameter, body...) 都传递给 PL/SQL 并通过 PL/SQL get API轻松访问得到,并且提供 API 可以轻松的写响应 ( status line, headers, body) 信息,那么就完全可以使用 PL/SQL 存储过程实现应用逻辑,而 Oracle 数据库也同时扮演了应用服务器的角色(和J2EE一样)。但是应用逻辑、页面生成逻辑和数据访问完全集成到 PL/SQL 一个开发环境上,这就带来了非常突出的简洁性和高性能。Oracle 自己也提供的基于 Apache+modplsql 的 PSP(pl/sql server pages) 技术,但是该技术在环境部署、系统管理、http 协议支持完整性、性能增强设施、页面生成设施、数据库常规协议负载等方面都存在明显不足和欠缺。因此,我参考了 oracle 的 psp 技术,使用 NodeJS 作为 http gateway 将请求转化为到 PL/SQL 存储过程的调用,设计了 NodeJS 和 Oracle 两侧的设施(分别使用javascript 和 pl/sql实现),设计了 PL/SQL API 用于做 web 应用,解决了上面所提到的所有 oracle psp 的问题。形成了完整和高效的 PL/SQL web 应用开发环境。此项技术被命名为 psp.web,也就是 PL/SQL stored procedure for web.

二、虽然 NodeJS 具有非常强大的网络开发能力,但是却不具备访问 oracle 这种大型专业关系数据库的能力,可以说他们目前还是在两个世界中。这个缺陷将明显导致 NodeJS 不能在行业信息系统使用,因为这些信息系统都是以数据和数据库为中心的,而这些数据库往往都是 oracle 等具有事务处理能力的大型关系数据库。如果 NodeJS 不能解决连接 oracle 的问题,就意味者他将被边缘化,最终沦为开源玩具。为此,Noradle 设计了 API,可以让 javascript (in NodeJS) 执行 oracle 存储过程,提交入参和请求体,接受包括标准 sql 结果集在内的各种格式的响应数据,甚至可以接受消息流(其中每个消息将触发单独的事件)。这时,如果您使用 express/jade 等 NodeJS web 架构,就可以将 oracle 的数据结合进来,开发出真正结合数据库的 web 应用来。此项技术命名为 DB driver for NodeJS.

三、第一部分提到使用 PL/SQL 用 Noradle psp.web 提供的 API 获取 http 请求信息并访问 oracle 库内数据,然后调用输出 API生成 html 页面。然是作为应用服务器 PL/SQL 还必须具有获取数据库外部服务和数据的能力,这个短板恰好是 NodeJS 的强项,因此 Noradle 提供了基础设施和 API 帮助 PL/SQL 调用 NodeJS 服务并接受 NodeJS 响应或回复。所有 oracle 需要外部支持的部分,都可以通过 NodeJS 代理服务予以支持。目前的设计是每个 oracle 服务进程只需要建立一个到 NodeJS dispatcher proxy 的连接就可以访问到全部的外部服务。这项技术的名字叫做 NodeJS Proxy for oracle external call。

可以看到,有了 Noradle 的以上三项支持,NodeJS 发烧友可以使用 oracle 来开发真正的信息系统,而 PL/SQL 开发者也可以开发完整的 web 应用并且可以整合所有外部资源。作为 Noradle 的作者,我本人更倾向语后者,理由如下:

  1. 真正的信息系统和网站应用往往主要以访问和处理数据,然后将数据搬到页面上的工作。使用 PL/SQL 开发集成度高(应用逻辑、页面生成、数据库表、SQL一体),动态页面的 IDE 也只需要一个(往往是 PL/SQL Developer 这个工具),开发效率和运行效率都比传统的分离应用和数据的架构要更佳。
  2. PL/SQL 本身存储于在数据字典中,ORACLE 对其有着完善的管理,包括自动的依赖管理,自动重新编译,本地编译,条件编译,安全的在线升级。包括可以嵌入或调用各种 oracle 专用的高级 sql(如级联层次查询、分析型查询、统计型查询、抽样查询、buld sql),table function,result cache (for sql and for function) 等等。包括使用包变量保存一个请求的中间处理数据的能力。还包括使用 rowtype 定义变量并将该变量直接带入 sql 中的方便性。