rails项目体验
在过去的16个月中我的同事们和我一直忙碌于一个比较大的rails项目中。 在经历了无数个加班和n个通宵之后终于看到我们的项目部署在6台IBM服务器上,在过去的一周中项目日渐稳定,这种心情只有经历过的人才能体会到。客户满意,BOSS也即将走出痛苦的泥潭,接下来的是最后的完善和部署到另外14台服务器上。忙碌,压力稍有缓解,准备接下来花一段时间把整个项目中遇到的各种情况,走过的弯路都记录下来,算是一年多来的工作总结,准备发到我的blog中,扩充一下我为数不多的blog数量。
这个项目是我职业生涯中第一个规模比较大的项目 我个人认为项目的过程是存在很大问题的,这中问题直接导致了项目开发周期如此长,rails的优势也没有显现出来。 如果重新来过,我觉得此项目是有可能在4-6个月内完成的。
一 目录
1 项目简介
2 需求
3 技术选型
4 架构和设计
5 详细设计
6 运维
7 rails在项目中的运用心得
(1) thin view,fat model?
(2 ) plugin or gems
(3) paperclip vs filecolumn?
(4) test?
(5) state_machine
(6) 全文检索
(7) js or frameworks
(8) 缓存的重要性
(9) 索引
(10) 定时任务
(11)view重用
8 数据迁移
(我目前想的目录大概是这么一个结构, 看起来是不是很软件工程。 其实我要表述的都是和rails相关的,上面的大部分都和rails有紧密联系,我想分享的也是关于rails的问题,对于每个部分我想都以项目中遇到的案例说明问题。)
项目简介
我也曾了解过国内其他公司的rails项目。大多都是互联网应用,很多大一点的项目都不会冒这么大风险使用rails来做的。 我们的团队中也有很多rails大牛,在社区中名气很高的。他们无一不认为国内很少有人使用rails来做这种项目的。 我们需要做的是把原来的一套asp系统和jsp以及部分php的改造为rails实现。别的不说,单单数据迁移的工作就够麻烦了。 客户那边以前系统有 4000+个数据库表(结构不同大概有350+),好在我们有ruby。
目前为止项目大概数据如下;
团队规模:20人+
持续时间:11 月
model数:300+ (持续增正中,还有些辅助功能没有开发)
controller:250 +
需求
数不清的软件工程和方法学的书籍讲授如果做需求分析,有些是在太老套了。 项目开始的需求就是按照这种老套的方式开展的。需求是人定的,人嬗变,需求自然也便。 项目初期我们大概花了一到两个月所有人都在做这件事情,结果证明这段时间是没有任何用处的,完全浪费,所有的文档也再一次svn故障中消失殆尽。 我们做这件事情是这样的流程,上午所有人,包括开发与qa到客户的各个业务科室了解业务,下午开会互相通报学习,总结成文档于图表。每周开一次全体会议总结需求学习。这样做结果是互相学习不充分,后来开发做需求人员之了解自己那部分,别人的自然是不了解的。另外还有人员流逝也是很严重问题。 需求这面除了浪费我们的那一段时间倒是没有引起更为严重的后果,不至于开发到一半发现程序于需求不符合。
项目进展到09年5月份是需求工作的一个转机,客户为了我们方便交流特地为我们预留了几间办公室,这样我们团队就整体搬到了客户处,客户那边有将近10个程序员,他们虽然对rails不熟悉,可各个都是业务和web开发方面的高手,于是20几个人在同一间屋子里边开发边了解需求。 那效率简直了。
所以我想如果有条件一定要让直接开发人员和客户保持最紧密联系。 拥抱变化和持续集成这两条原则在我们项目中简直登峰造极了。 客户要求什么我们就做什么,我们做的结果客户马上能看到,有问题马上修改。
这个过程中有人可能会提出问题,如果客户要求无穷尽怎么办。 其实我们在整个项目中有一优势,那就是面对我们的直接客户都是it从业人员,他们了解需求实现的难度。 最怕的是客户懂也不懂,他们的要求往往难实现并且修改起来难度大。 其实我想甲方和乙方在尽快完成项目的出发点是相同的。大家的目的都是尽快完成项目。 如果真遇到刁难的用户,需求不断变化,那就该市场人员出场了, 大不了做需求变更吧。 rails的优势就是不怕变化, 其实想想 rails的企业项目中用的无非就是scaffold的场景。列表,查看,修改足已,即使再变化还能有多大余地。回想起来我们整个项目中的场景大部分都是 scaffold的那几个默认action能够实现。
技术选型
前面的需求和rails关系不大,技术选型就不同了。 我们的很多中间件的选择都是和rails相关的,这部分比较有意思的。 我们的项目中使用到工作流的场景很多,存储的选择上也费了一番周折,消息总线,全文检索在选型上都是费了些周折的。 现面我将一一讲述,虽然上面的选型我们在后来是在认清问题后抛弃不用的。
工作流:
这部分我认为是企业级比较核心的东西,比较可惜的是我一直没有机会了解。 据我目前了解rails社区里不只一家公司在这方面做自己的东西,我的两个同事都在工作中完成了自己的工作流引擎。我们整个项目经历过三个不同的引擎。 第一款为开源的openwferu,用了两个多月后放弃,我个人感觉是因为对团队中对它了解不足,之前最了解它的同事离职,另外就是舶来品水土不服,经过n多次的修改以及为作者提供了若干patch后最终放弃。对此产品的优缺点我不是很了解。此时正好赶上某rails大牛的加入,大牛的名字我说了应该很多人知道(此大牛是我偶像)。大牛经过几天对openwferu的了解和一晚上加班后我们有了自己的工作流引擎和设计器。
此引擎现在还安静的躺在我们的代码库中,取代之的是另一位rails企业级牛人自己的产品,此引擎以经被应用到若干项目之中。
消息总线:
工作流部分我不是很了解,但消息总线却花了几个周来了解各个产品。 之所以选择消息总线的原因是用在消息异步处理上,为了防止网站前端对端压力过大或者业务过大对工作流引擎压力过大。充当缓冲区功能。经过几番google。最终确定几个候选方案。
1 activemq 支持协议比较多,社区支持度高。缺点是对rails来说显得有点笨重,ruby能够使用的协议也就是starling了, 有点牛刀杀鸡。这也是最终方案,看中的主要是社区比较好,资料好找点。rails通过active-messaging于之通信。
2 rabbitmq erlang实现的旗舰产品,缺点是实在不想在引入一个大家都不熟悉的东西。
3 starling ruby实现的小东西。 性能一般,稳定性不好说。
ps:记得当初在我自己机器上测试rabbitmq性能卓越(看来erlang这东西名不虚传,我要好好看看我那本erlang编程了)
存储:
客户之前的数据库是mssql,我们给出的方案mysql。 另外客户有一套oa的存储采用的是openldap。团队中有人提出我们也把基础数据如用户信息和单位信息以及权限控制放在openldap中做。 这样做的好处是集中控制和与其他子系统集成好,其他子系统指的是客户的一套IM和邮件系统。如果做集中存储的话就会省去用户同步的麻烦, 这种方案看起来很perfect。 这块的技术选型个程序实现都是我实现的,经过一个月左右的开发我们最终放弃了这种方案。 原因是与openldap作连接的activeldap毕竟不是rails的核型模块,而我们把最核心数据存在activeldap中后于activerecord做关联后很不方便。很多人开始在数据库里做这些数据的同步,我们事实上又没能避免同步的问题。
当我有一天在一个知名rails博克上看到把openldap作为nosql的存储时,感触很深。其实openldap做为存储介质有很多的优点,尝试nosql的同学们不妨考虑一下openldap。 openldap有以下优点
1 速度自然不用说,openldap采购berkerldb做存储。
2 结构性很强,表达力很好, 定义不比sql麻烦。
3 支持继承,这点很爽
4 备份和恢复都极为方便。 尤其备份,openldap可以轻松把分支备份到其他机器上。 也算是扩展性良好。
全文检索:
全文检索我了解不多, 这块开始也做过很多调研。 专门分出一个同事来做这方面的东西,我们使用的是sphinx。但是最终也没能在项目中真正的用上,原因是对我们来说过于复杂,需要搜索的内容都存在数据库的不超过四个表的字段中。 最终我们选择了mysql的full_search功能。 完全满足需求,简单方便。
架构和设计
这块的内容是我腹稿中最大一部分。 好不客气的认为是架构和设计导致整个项目延误了整个工期。但是存存在总有存在的道理。 我们的架构经历过数次的调整。 每一次调整都是在上一次教训上总结的,所以整个项目下来,每次都有新的体会。大概有四次的主要变化,这部分中我将详细介绍我们项目的整体部分和每次变化的原因。
未完待续....
分享到:
相关推荐
通过一个简单的通讯录应用为例,可以快速体验RoR的开发流程:首先,新建RoR项目并设置名称和位置;接着,进行数据库配置,通常会自动生成与项目名对应的数据库;然后,利用RoR的命令生成数据库,项目结构会自动建立...
这里还会涉及如何创建第一个Rails项目,以及如何运行服务器以查看项目。对于新手来说,这一步骤是至关重要的,因为它将奠定后续学习的基础。 #### 3. Introducing Ruby(介绍Ruby) Ruby是一种动态、面向对象的...
### 基于Ruby语言的Ruby on Rails项目及其代码方案 #### 一、项目概述 本项目基于Ruby语言,利用Ruby on Rails(简称Rails)框架构建。Ruby on Rails是一款使用Ruby语言开发的应用程序框架,其核心是MVC(Model-...
- **创建项目**:使用`rails new`命令创建一个新的Rails项目。 - **配置Git**:设置版本控制系统,确保代码变更能够被追踪记录。 - **使用Bootstrap进行前端设计**:介绍如何使用Bootstrap框架来快速搭建美观的...
同时,`jquery-ui-1.10.4.zip`文件包含的是jQuery UI的一个具体版本,如果需要自定义某些组件或者使用非默认的主题,可以直接解压这个文件并将其内容引入到Rails项目的assets目录下,以便在asset pipeline中使用。...
这个工具简化了在Rails项目中使用Go进行后端处理的流程,使开发者可以利用Go的性能优势处理高并发请求,同时保留Rails的便捷开发体验。 ### 2. 安装`GoOnRails` 首先,确保你的系统已经安装了Rails和Go。接下来,...
3. 克隆或下载Rails 4.2.0项目的源代码,或者创建一个新的Rails项目,使用`rails new my_app -d sqlite3`命令,其中`my_app`是你的应用名,`-d sqlite3`指定使用SQLite数据库。 4. 进入项目目录,运行`bundle ...
此外,还会介绍如何设置Rails项目的结构,包括如何创建一个新的Rails应用。 ##### 2.2 用户模型设计 第三章“Modeling users”深入探讨了如何设计用户模型,这是构建任何社交网络的基础。本章将涵盖如何定义用户...
在实例开发过程中,我们可能首先会设置一个新的Rails项目,通过`rails new`命令创建基础结构。接着,使用Rails的生成器创建控制器、模型和视图,如`rails generate controller`或`rails generate model`。然后,配置...
1. Rails 3.0: Rails 3是重大升级,引入了ActionController::Metal,这是一个轻量级的控制器,用于提高性能。同时,它引入了多路由引擎支持,如Rack中间件,使得与其他Web服务器的集成更加容易。此外,ActiveRecord...
5. **理解Rails结构**:Rails项目的结构包括`app`、`bin`、`config`、`db`、`lib`、`log`、`public`、`test`和`vendor`等目录。每个目录都有特定的作用,例如`app`包含模型、控制器和视图等;`db`用于数据库相关的...
使用Edge Rails的插件,如CRUD Generator 2,可以让你提前体验并利用到Rails的前沿技术。 **2. CRUD Generator 2的核心功能** CRUD Generator 2的核心是自动生成模型、控制器、视图以及相关的数据库迁移文件。它能...
其次,`meetup`很可能是一个Rails项目的文件夹,包含所有必要的组件,如`app`、`config`、`db`、`lib`、`public`、`test`等。`app`目录下有模型(models)、控制器(controllers)、视图(views)和其他组件;`...
为了验证环境是否配置成功,创建一个新的Rails项目。在命令行中导航到你希望存放项目的目录,然后输入`rails new myapp`(myapp替换为你项目的名称)。这将生成一个新的Rails项目结构。 接着,打开RadRails,导入刚...
- 如何配置Rails项目以支持Prototype库。 - 如何编写前端JavaScript代码发起Ajax请求。 - 如何在服务器端处理Ajax请求并返回数据。 - 如何使用返回的数据更新页面内容。 ### 结语 通过以上分析可以看出,“Ajax on ...
2. **Rails引擎**:可能包含了Rails引擎的实现,允许快速集成到现有的Rails项目中,提供即插即用的功能模块。 3. **示例应用**:可能包含一个示例应用,展示如何将模板与Rails框架结合使用,帮助开发者理解如何启动...
Rails社区活跃,有大量的开源项目和插件可供参考和学习。 通过阅读《Ruby on Rails中文指南》,你将逐步熟悉这些概念和技术,最终能够熟练地使用Rails框架构建功能丰富的Web应用。无论你是初学者还是经验丰富的...