BT

你的观点很重要! 快来参与InfoQ调研吧!

Luke Galea谈Ruby和Erlang
录制于:

| 受访者 Luke Galea 关注 0 他的粉丝 作者 Werner Schuster 关注 4 他的粉丝 发布于 2009年11月20日 | ArchSummit社交架构图谱:Facebook、Snapchat、Tumblr等背后的核心技术
16:07

个人简介 本视频由李永伦翻译,刘申审校。

Luke Galea是Avid Life Media的开发总监,这是一家拥有多个大型约会网站的多伦多公司。他是Rails的Hyperactive Resource插件的作者,活跃于Ruby和Erlang社区。他最近的项目是http://www.cougarlife.com。

FutureRuby并不是一个Ruby大会,但却是一个Rubyists大会。我们为大家提供一个机会来描绘长远的目标,我们希望在未来,Ruby会为我们的生活带来更多的创新。

   

1. 这里是FutureRuby 2009,多伦多。坐在我旁边的是Luke Galea。何不先来个自我介绍?

我是一名Ruby开发者,在多伦多的Avid Life Media公司工作。我们拥有很多约会网站,最著名的是www.establishmen.com。我们处理来自世界各地的大量用户的请求。我们克服了很多技术难题,我们用Merb创建了一个非常棒的平台,以Erlang作为后端,用这个平台驱动了我们最新的网站的开发,比如说 www.establishmen.com,还有许多网站在做。这真是个有趣的经历,从我们的老网站上吸取经验,比如说www.hotornot.com 和www.ashleymadison.com,并且融入使用最新技术创建的网站里。Ruby、Merb、Erlang使我们可以在极短时间里把一些很棒的东西融到一起,这些东西无论从开发的角度还是从用户的角度都有着令人惊异的性能。真让人兴奋。

   

2. 在把不同的网站从其它平台转到Ruby的过程中,你也把这些不同的网站统一到一个通用平台上,对吗?

没错。在这一点上,我们更关注使平台的功能完善和稳定。我们不打算换掉所有网站的PHP,但最终我们希望有一个平台可以处理所有东西。按照我们的开发进度,通过我们所有现代工具获得的开发速度,我预期我们很快就可以实现目标,所以很兴奋。然而,在这一点上,我们正在开发一系列网站,一个比一个更困难、更复杂,这迫使我们不断地往这个平台里添加功能,以便证明这个平台适用于非常艰难的情况以及允许我们逐渐地往里面添加功能。这的确有很多乐趣,挑战也很大。我们努力使所有东西保持抽象和通用,同时也能适应每个网站的特殊性。

   

3. 你在前端(也就是网站)使用Merb和Rails,你也把它用于其它部分的逻辑吗?

我们使用这种逐渐被认为是标准的模式:jQuery在前端,Haml和SASS处理所有显示,然后我们用Merb和DataMapper做网站本身,但是,为了使事情来得更好,我们在后端结合RabbitMQ使用了Erlang。基本上,所有可以异步处理的东西我们都交给Erlang处理,而我们也正是这样做的。从用户的角度来看,他们很快就能看到他们的页面,但在后台,事情还在处理。当某人登录进来,我们马上在后台开始工作,为的是预先帮他们准备好需要的东西,或者找出它们接下来会看到谁,或者预先生成一组可能的搜索结果诸如此类。当然,后台还会碰到很多需求,但Merb处理了大部分逻辑。

   

4. 你是怎么接触Erlang的?

几年前我遇到Erlang,那时我正在为大学的帮助网络中心工作。一开始我把它看作一门ETL(提取、转换和装载)语言,从各个不同的医疗系统获取数据,然后对它进行转换并把它装载到数据仓库或者之类的东西里。现在,所有东西要么通过自定义的专有语言完成,这些语言是函数式语言,要么人们通过他们恰好懂得的语言把它整理到一起。我认为Erlang是负责这项工作的极佳语言,但是,我逐渐发现,它缺少了很多很多Ruby爱好者喜欢的东西。

没有变形库(inflection libraries)帮你把字符串或之类的东西复数化或者单数化,所以我要到Ruby那里拿到Erlang这里用,我认为那些东西非常酷,因为大部分 Erlang开发者都是做电信的。所以他们从不写复数库或者变形库,但是,如果Erlang想得到更多的支持,它就该有这些使Ruby变得很棒的东西。尽管如此,从专业的角度来说,我们实际上只用Erlang做一些消息通信和后台处理之类的东西。我希望他们继续增强类库和语言的功能,使之最终成为一个可以用来轻松开发整个网络应用程序的地方。

很高兴看到Ruby社区的人逐渐对Erlang产生兴趣。在去年的RubyFringe,很多人开始讨论我们各自是如何使用Erlang的,很多人都觉得对于Ruby爱好者来说它将会是下一个焦点。所以我们创建了多伦多Erlang小组T.Erl,Ruby爱好者聚集到这里讨论Erlang,我们还有少数人每天领取工资从事Erlang开发的,我认为随着时间的推移,我们将会逐渐看到更多人领取工资从事Erlang开发,越来越多Ruby爱好者会发现 Erlang对其工作的帮助。

   

5. 你是怎样与Erlang进行互操作的?Erlang是以某种网络格式获取消息的吗,Jabber还是其它方式?

我们使用的是RabbitMQ,这是一个消息队列。基本上,我们从Ruby往队列发送消息,然后它们会在后台处理,这是一种做法。另一种做法是按照网站,更确切地说,按照使用情况通过XMPP进行交互,这是一个Jabber协议。如果我们要做通知机制,或者试图获得接近实时的效果,那么我们会把它看作聊天协议。我们有一些自定义的聊天数据包可以发送到ejabberd,这是Erlang Jabber后台程序,然后把它分发给所有需要知道礼物已经发出或者新的私人消息已经收到的人。

   

6. 你提到使用Merb,它快要被淘汰了。你会不会对此感到高兴?你打算使用Rails吗?你是否为此使用Rails的子集?你有什么计划?

这绝对是个好问题。过去,我只用Rails,但直到你用了Merb才意识到你错过了什么。事后发现Rails很不一致。它的API不像Merb那样深思熟虑的简洁,我明白这是因为Merb从Rails 那吸取了教训,并且无需顾虑向后兼容等问题。在这一点上,很难想像它们之间是如何协调的,因为在Merb开发者和Rails开发者的角度来看,这些API 如此不同,以至于我不能简单地来回切换。

如果我写了一整天Merb代码然后回家,我无法轻易用回它,因为它快要关闭了,我猜这是因为Rails有一个很大的用户群,所以Rails 3.0将会偏向Rails而不是Merb。从我们的角度来看,我们要么在将来某个时刻饮弹自尽,要么把所有东西都转到Rails 3.0,或者,如果我们找到足够的支持使Merb存活下来,那么我们会坚持下去,但我预料大部分使用Merb的人都会转到Rails 3.0。

   

7. 据说有人计划提供了一些工具,帮助从Merb转到Rails。你见过这些工具吗?

没有,我还没试过这些工具。我怀疑有些东西用过就忘了。我不认为你会在它里面运行某些东西。甚至曾经有些工具可以帮助你从Rails 1.0转到Rails 2.0,它会找出代码里的参数、添加参数或者诸如此类的问题。API的改变只需进行文本搜索,找出你在哪里使用了它们,然后你自己去那里修正。我相信这些东西是有用的,但我们的工作量仍然很大。即使Rails的一次小改动的升级也是一个大问题。

过去,在我工作过的MDL(Medical Decision Logic),我们的原则是,如果我们想用新版Rails的一个功能,这将会是我们升级的合理理由,但我们不会为了升级而升级,因为在很多情况下,网站工作良好,所有人都感到很满意。我们不会被任何版本不一致性拖累,要证明花费的时间是合理的真的很难。Active Resource就曾经导致我们这样做。我们在MDL有个应用程序用于临床癌症研究,它大约有55,000-60,000行Ruby代码,这是一个大型 Rails应用程序。我们决定升级到新版的Rails,是Active Resource使我们踏出这一步的,因为我们需要连接不同的系统,而这似乎是最佳的途径。

   

8. 你创建了新版的ActiveResource?

是的,我们详细检查了把这个庞大的应用程序升级到新版的Rails将会遇到的所有问题,然后我们开始使用ActiveResource,我们发现所有需要注意的问题都出现了,比如说,我们启动它并查看所有文档,但注意事项不正确。它的API应该和活动记录(active record)的一样,但它只有很小的一部分,甚至在某些情况下,相同的方法实现了,但这个实现包含了不同的语义,行为也不一样。它们很接近,以至于你发现你期望能做的事情做不到,以及你通常能做的事情突然在后面出错了。

我们当时的做法是创建了HyperactiveResource并让它扩展Active Resource,然后修改它的行为,还添加了新的行为,以便支持诸如关联之类的东西,并使一个活动资源(active resource)能从属于另一个活动资源或者一个模型,还有的就是使活动记录和活动资源共存并相互引用。我想说的是,如果你想使用 ActiveResource来创建映射,你真的需要看看Hyperactive Resource,否则等着你的将会是一个痛苦的世界。

   

9. 你提到你曾在医疗领域工作过。你那时做的是什么?

开始时我为多伦多以及一个医疗网络的众多医院工作,我们的应用程序很多都是内部的,它们为医院里的多种不同功能提供支持。我第一次接触Ruby时就遇到Rails了,那时离1.0版的发布还有很久,我们看到一个试用它的机会,我们有5、6个用户,他们都是内部的,他们对停机时间以及我们期望遇到的奇怪问题都很宽容。

因此,我们引入Rails,用于图表跟踪以及许多其它需求,像健康记录。随着时间的推移,它逐渐成长,因为它使我们很容易就可以添加新特性。越来越多功能在我们的Rails应用程序里完成,比如说,在后台跟踪病人的图表去哪了或者两个医生之间的来往信件等等。最终,我从那转到从事医疗研究软件,我们协助医生进行大量临床试验,你有上千个病人试用新型抗癌药物,你需要跟踪他们的进展、实验结果以及所有这类东西。

   

10. 这基本上是数据库应用程序?

粗略地说,是的。我想,临床研究管理系统的一大部分是时间表以及核对某些事实,比如说,你有一个药不能在特定实验结果出来的两天内服用,因为它会扭曲这个结果或者这个药会产生冲突。当你面对一个要试用不同实验提供的20到30个药的病人时,找出哪些天应该服用哪些药以及实验将在何时结束就会成为真正的问题。

我们允许他们输入这项研究的元数据,并使用它们从Ruby里调用Prolog,Prolog善于约束求解(constraint solving),于是Ruby会定义所有这些约束,然后Prolog会核对所有事情发生的理想时间并把结果转换到病人的日历里。他们可以说:“好了,我知道周一或者周二我要过来试用这个药,如果因为某些原因拖延了,就会和其它东西冲突。”

   

11. 这是否意味着你从Ruby或者Prolog输入数据创建Prolog代码?

是的,我们创建了一个Prolog输入数据。最终也没有那么多Prolog代码。这是因为这个语言非常适用于这个问题,它很简洁。在 RubyFringe,有很多讨论是关于使用多种语言的,我个人认为这就是生活之道。我们在需要时使用Erlang,我们使用Ruby,过去我们也用 PHP,Prolog,在那种情况里,Rails应用程序生成Prolog输入,接着发送到一个正在运行的Prolog进程,然后它会取回结果并进行解析。

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT