转载

dRuby 的机制与实现

面向对象的脚本语言 Ruby 由于它代码容易编写并且灵活,动态的特性被众多程序员喜爱。过去的几年里,Ruby onRails 的 web 开发框架非常流行,这是得益于它的开发效率,而且再次引起了企业对 Ruby 的关注。Ruby 的焦点已经开始从小的脚本工具向大型应用程序转移,针对于 Ruby 的分布式系统的需求和 Ruby 一般用法的例子与特性的相关教程也正在与日俱增。一本由日本作者写的关于 dRuby 的书,其英译版正在由 Pragmatic Bookshelf 计划出版。

作者开发 dRuby 和 Rinda 是为 Ruby 语言提供分布式对象系统和共享元组空间功能, 并且也作为 Ruby 标准库的一部分。dRuby 通过网络扩展了 Ruby 同时还保留了其优点。Rinda 在 dRuby 的基础上构建,并且带有 Linda 的功能,是作为 Ruby 与分布式协作系统通信的中间语言,这篇文章讨论了这两个系统的设计原则和实现要点,并且用示例代码和实际应用程序的例子来展示它们的简单易用性。dRuby 和 Rinda 除了可以做分布式系统,这篇文章还会给你展示它们可以作为现实中应用程序的底层组件。

1. 介绍

这篇文章的目标是给你一个关于 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 的设计原则和特性。

2.1 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(原始叫法是迭代器)和异常是可以被处理的,如果是在本地的话。互斥,队列和其他线程同步机制都可以同时被用来进行进程间同步,无需任何特殊考虑。

正文到此结束
Loading...