面向对象的脚本语言 Ruby 由于它代码容易编写并且灵活,动态的特性被众多程序员喜爱。过去的几年里,Ruby onRails 的 web 开发框架非常流行,这是得益于它的开发效率,而且再次引起了企业对 Ruby 的关注。Ruby 的焦点已经开始从小的脚本工具向大型应用程序转移,针对于 Ruby 的分布式系统的需求和 Ruby 一般用法的例子与特性的相关教程也正在与日俱增。一本由日本作者写的关于 dRuby 的书,其英译版正在由 Pragmatic Bookshelf 计划出版。
作者开发 dRuby 和 Rinda 是为 Ruby 语言提供分布式对象系统和共享元组空间功能, 并且也作为 Ruby 标准库的一部分。dRuby 通过网络扩展了 Ruby 同时还保留了其优点。Rinda 在 dRuby 的基础上构建,并且带有 Linda 的功能,是作为 Ruby 与分布式协作系统通信的中间语言,这篇文章讨论了这两个系统的设计原则和实现要点,并且用示例代码和实际应用程序的例子来展示它们的简单易用性。dRuby 和 Rinda 除了可以做分布式系统,这篇文章还会给你展示它们可以作为现实中应用程序的底层组件。
这篇文章的目标是给你一个关于 dRuby 和 Rinda 的细节。dRuby 为 Ruby 提供分布的对象环境。Rinda 是一个运行在 dRuby 上的协调机制。首先,我来介绍 Ruby。
Ruby 是一个面向对象的脚本语言,它是由松本行弘(Yukihiro Matsumoto)创造。
直到现在,Ruby 的流行被限制在早期采用的程序员社区中。但是,Ruby 因为其潜在的生产力,现在正在快速引得商业用户的注意。
Ruby 有如下特性:
标准的面向对象特性,比如类与方法
一切皆为对象
弱类型变量
简捷方便的使用库
简单易学的语法
垃圾回收器
丰富的反射功能
用户级线程
Ruby 号称是动态的面向对象语言。一切都由对象构成,并且无强类型变量。方法统一在运行时创建。此外,Ruby 还有丰富的反射功能,并且可以使用元编程。
Ruby 是一门难解的语言,好像是老天对 Ruby 开了个玩笑。就像 Ruby 在主导着我们进行编程一样,在我们没有得到明示的情况下就觉得已经触及了面向对象的本质。
dRuby 是一个使 Ruby 运行于其上的分布式系统环境。dRuby 通过网络扩展了 Ruby 的方法调用,并且使得其他进程或者机器也可以调用当前对象的方法。另一个就是 Rinda 在它自己内部加入了 Linda 的实现,所以它提供了公共的元组空间。这篇文章不但介绍了 dRuby 的基本概念和设计原则,而且还包括 dRuby 的实现和实际用法。这篇文章会讨论如下主题:
在 Ruby 之路 - dRuby 概述与其设计原则
实现 - dRuby 的实现
性能 - dRuby 的使用开销
应用程序 - 一个真正运行在 dRuby 上的系统应用,Rinda 的概述与运行在 Rinda 上的一个系统应用。
Blaine Cook,Twitter(一个微博服务)的主要开发者负责人,在他的“"Scaling Twitter”发布会中提到过dRuby。
简单至极,速度够快
些许古怪,无冗余,高耦合
他的观点是合理的看法。
在这章里,我会说一下 dRuby 的设计原则和特性。
dRuby 是用于 Ruby 的 RMI(远程方法调用)库的其中一个,我的最终目标不是让 dRuby 成为另一个用于 Ruby 的传统的分布式系统。准确来说,我打算扩展 Ruby,使其可以调用其他进程或者别的机器上的 Ruby 方法。
最终,dRuby 扩展了 Ruby 解释器,使其无论在物理环境还是虚拟环境都可以跨进程,跨机器。
dRuby 有如下特性:
专门用于 Ruby
完全纯 Ruby 编写
不需要像 IDL一样的规范
从常规的分布式对象系统的角度来看,dRuby 还有这些特性:
便于安装
易于学习
能自动选择对象的传递策略(传值或者传引用)
足够快速
服务器端与客户端无差别
dRuby 是专门用于 Ruby 上的分布式对象系统,dRuby 运行的平台上可以交换对象,也可以在对象之间调用方法。dRuby 可以不受操作系统影响,运行在任何可以跑 Ruby 的机器上。
dRuby 完全由 Ruby 编写,没有特殊由 C 编写的扩展。感谢 Ruby 优秀的 thread,socket 和 marshaling 类库,早期的 dRuby 实现仅有 200 行代码,我相信这足以展示了 Ruby 类库的强大和优雅。现在 dRuby 包含了 Ruby 的标准发布版作为其标准库之一,所以 dRuby 在任何装了 Ruby 环境的机器上都可以跑起来。
dRuby 特别注意保持与 Ruby 脚本的兼容性。dRuby 向 Ruby 加入分布式对象系统的同时也尽可能多的保留了 Ruby 的原汁原味。Ruby 程序员会发现 dRuby 是 Ruby 的无缝集成扩展。程序员可能习惯于其他的分布式对象系统,而且可能会感觉到 dRuby 有点奇怪。
Ruby 里的变量都是弱类型的, 而且对象赋值不受继承体系限制,不像一些静态检查变量的语言,如java,在代码执行之前不会检查对象的正确性,并且方法定位也只在运行时(方法被调用的时候),这是 Ruby 语言一个重要的特性。
dRuby 也以相同的方式运行。dRuby 中,客户端静态方式 (DRbObject,在 dRuby 也称之为 "reference" ) 也同样是弱类型的,而且方法定位也只在运行时进行。这就不需要提前暴露方法列表或者知道继承信息。 因此,不需要定义一个接口(e.g. by IDL)。
除了允许跨网络方法调用,dRuby 也一直在用心的开发,遵守尽可能接近常规 Ruby 行为的准则。因此,开发者可以尽情的享受大量 Ruby 的独特优势。
例如,方法使用 blocks(原始叫法是迭代器)和异常是可以被处理的,如果是在本地的话。互斥,队列和其他线程同步机制都可以同时被用来进行进程间同步,无需任何特殊考虑。