rails
用 PostgreSQL Schemas 创建多租户 Rails 应用

许多 Rails 应用有多租户的需求。为此可以采取多种不同的策略,而每种策略都各有利弊。Guy Naor 曾对每一策略的利弊都进行了详细论述,具体可以参考他的 2009 Acts As Conference talk(必看)。1
这些多租户策略之一运用了 Postgresql 特有的称为 “Schemas” 的特性。不过 Guy 只是在技术层面泛泛带过,并未深入到实现细节。要如何运用这一策略来实际完成多租户应用,你可以从网上搜到几篇博客、StackOverflow 的讨论以及一些半成品,但诸多细节还要自己推敲,这里我将之记录下来,以飨读者。
为什么使用 PostgreSQL Schemas
Guy 列举了多租户 Rails 应用的三种基本策略:2
- 每个租户使用独立数据库
- 单一数据库,用记录维护着租户关系的范围
- 单一数据库,每个租户使用不同的 Schemas (只适用 PostgreSQL)
选择哪一种策略需要诸多考量,这里不一一列举,我想说的是,对于第 3 种策略,应用应有以下特征:
- 租户的数据是私有的,不能泄露给其他租户
- 几乎不进行跨租户数据聚合的查询
- 租户数量很多,无法承担过高管理开销
由于应用间存在千差万别,所以个人建议你最好认真看完该演讲,然后自己阿里做决定。如果你最终还是选择了 PostgreSQL Schema ,你再回来继续读完这篇文章。
Rails3 技术手册 (一) 概述

英文原文
Ruby on Rails 是用于快速简洁地开发 Web 应用框架。它被 37signal 公司的项目管理工具 Basecamp 中剥离出来,其作者 David Heinemeier Hansson 率先用 Rails 着手解决手边的现实问题。 我们会发现用 Rails 进行开发时充满乐趣, Rails 负担起了开发中那些无聊的琐事,因此开发者能专注于所要解决的问题本身。
你如果不理解这些开发中的琐事,可以看一下下面的例子:编写过 Web 应用的开发者都不可避免地会用到字典结构、缓存、数据持久化、模板系统、测试框架、路由等等组件。Rails 自身就带了这堆让应用上线运行所必需的组件,而且作者在编写它们时充分考虑了彼此的适配问题。以往希望模板语言能和复杂的 ORM 层能在一起工作的麻烦现在再也没有了。一切将是如此简单。
现在开发者无需再为数据库等的组件编写大量繁琐的 XML 配置。Rails 基于约定而非配置,配置因而精简到最少。假如 Animal 类就是关联到数据库的 animals 数据表,为什么还要让开发者花时间写配置文件来链接它们? 这一切就让 Rails 来帮你吧。
简而言之,Rails 让 Web 开发充满乐趣。
架构
Rails 应用开发是基于模型-视图-控制器模式的 (MVC) 的。想了解 Rails 是如何使用 MVC 的, 最简单的办法是透过了解 Rails 请求的生命周期。如图1-1所示:
Ruby Slim 模板语言

Slim 是一个快速的轻量级的模板引擎,其设计目的是通过精简视图端语法,让开发者更专注于内容的本质。Slim 支持 Rails3,在 Ruby 1.9.2和 Ruby/REE 1.8.7 上都能正常工作。
Slim 的语法的设计思想是,“够用即可- What’s the minimum required to make this work” 。 在后面的例子中,我们将会看到 Slim 的语法是多么简洁。随着越来越多的人参与到 Slim 项目里,现在 Slim 也可以支持 Haml 和 Jade 的语法附加。 Slim 团队很欢迎这些扩展,因为对编程语言的审美观是因人而异的。
Slim 使用 Temple 来进行解析/编译,它也被集成到 Tilt,因此 Slim 可以很好地和 Sinatra 或者单纯的 Rack 一起工作。
为什么需要 Slim?
在 Rails 社区,Erb 和 Haml 无疑是两大最流行的模板引擎,但是 Erb 的语法相当累赘而 Haml 的语法则含糊不清难以接受。 Slim 采用的是非常简化且高效的语法,就执行效率而言,用户是无需顾虑的。
没错,Slim 非常之快。在本文的最后你可以找到基准测试的结果,如果你对测试结果持保留意见,那我们也提供了进行基准测试的 rake 任务,你可以自己动手测试来查看结果。