一种复杂Rails系统架构优化方法
来源:用户上传
作者: 王鑫
摘要:本文将介绍一种Rails系统架构优化方案,将复杂的Rails单一系统拆分成相互协作的多个轻量级应用集群,从根本上解决Rails系统在处理复杂的业务时代码臃肿、开发效率降低、难以维护与部署等问题。
关键词:Rails系统;架构;集群
中图分类号:TP309.5 文献标识码:A文章编号:1007-9599 (2011) 24-0000-01
A Complex Rails System Architecture Optimization Method
Wang Xin
(91245 Troops,Huludao125000,China)
Abstract:This paper introduces a Rails system architecture optimization,complex Rails single system split into mutual cooperation more lightweight application clusters,a fundamental solution to the Rails system is bloated code when dealing with complex business and development efficiency problem,it is difficult to maintain and deploy.
Keywords:Rails system;Structure;Cluster
Rails近几年在国内受到越来越多的开发者的青睐,Rails应用也从较简单的内部系统深入到复杂的企业级应用。Rails“习惯优于配置”的思想以及ActiveRecord等众多优秀的技术极大地提高了开发效率,但在业务复杂的大型系统中,Rails应用也会面临很多问题。
一、复杂Rails系统存在的问题
用Rails可以快速搭建一个较简单的应用,但当业务需求急剧增长,功能越来越复杂时,系统的维护和扩展会变得越来越困难。一般情况下,问题主要表现在以下几个方面:(1)代码臃肿(2)难以测试与部署(3)影响团队建设。
二、使用轻量级应用集群进行架构优化
为解决复杂的Rails系统产生的一系列问题,我们将单一系统按照业务功能进行划分,每一部分用一个独立的Rails应用来实现,从而形成若干个轻量Rails应用集群,这些应用相互协作,共同实现整体业务逻辑。拆分后每一个Rails应用具有如下特征:有独立的数据库,可以独立运行;程序代码量比较小,一般情况下只需要一到两个程序员开发与维护;高内聚、低耦合。
(一)用户体验一致性。系统进行拆分后,由若干个轻量级应用共同协作来完成某项业务操作。由于每一个应用都是独立的Rails程序,而一个较为复杂的业务流程可能要在多个应用间跳转,所以首先要解决用户体验的一致性问题。使用户体验最直观的页面样式。为了保证用户在不同的程序间跳转时没有突兀的感觉,每个应用看起来都应该“长的一样”。为达到这一目的,我们采用统一的css框架来控制样式。
(二)通用客户端组件。拆分后的Rails应用虽然处理的业务逻辑各不相同,但在用户交互上有很多相似的元素,例如查询表单、日历形式显示信息等。把产生这些元素的代码抽象成通用的方法,不仅可以保持用户体验的一致性,更可以减少代码重复,提高开发效率。
(三)数据共享与交互。由于每个Rails应用都是整个业务系统的一部分,除了保证用户体验的一致性外,还需要解决程序间的数据交互与共享问题。下面我们以一个简单的例子来说明如何实现。
例如一个简单的在线学习系统,用户在线购买和学习课程。按照业务逻辑将系统拆分成四个应用,分别用于课程信息管理(course)、用户注册登录及帐号管理(user)、订单系统(purchase)以及在线学习系统(learning)。这几个Rails应用中各自业务的实现比较简单,不再赘述。在示例程序中,用户需要购买课程后才能开始学习。由于我们对系统进行了拆分,订单和课程在两个不同的应用中进行管理,而用户下定单时需要查看课程列表,这就涉及到一个应用(purchase)如何获取另一个应用(course)数据的问题。
最直观的做法直接从数据库读取这些信息。只读数据库适应于业务逻辑比较简单的数据读取,如果数据需要预先进行复杂的操作,就无法简单地通过只读数据库取得数据。另一方面,应用间有时候确实需要进行一些写操作,这时候就需要借助于其他手段了。
(四)用户及权限控制。除了数据交互外,另一个重要问题是用户的管理,包括系统登录、权限控制等方面。示例程序中,我们用user这个应用来管理用户信息(1)单点登录:在应用集群中,用户登录某一个应用后,再访问其他应用时应该不需要再次验证,这就需要实现多个应用间的单点登录,实现单点登录有很多方法,我们采取一种非常简单的方式,就是多个应用共享session。
(五)权限控制。我们采用基于角色的权限管理来控制对应用程序的访问,并且在core应用中集中管理。应用中每一个Controller作为一个权限控制节点,在server启动时,像配置信息一样,各个应用将自己的Controller结构发送到core,由core统一管理与配置。
将大系统拆分成小应用是基于业务来进行的,每一个应用处理一套功能上接近的、完整的业务逻辑。而每一个小应用Controller的结构,对于有多种角色的系统来说,应该按照角色来组织,这样可以有比较清晰的结构。Controller做为节点的方案也在一定程度上强迫开发者按照角色设计良好的Controller结构。
(六)辅助系统。除了统一的UI、数据交互和用户共享外,还可以把一些常用的功能如上传附件、发送邮件等抽象出来,在更高级别上减少重复代码。由于这些功能比较复杂,不像UI Helper等用简单的一两个方法就可以完成,所以我们用独立应用和对应的gem相结合来实现。
以发送邮件功能为例,首先创建一个Rails应用mail,主要功能包括管理邮件模版、统计发送数量、完成邮件发送等;然后创建一个gem,在这个gem中包含MailService,其他应用引用这个gem后就可以调用MailService的相关方法完成邮件发送。
三、架构系统划分原则
系统划分是否合理直接关系到代码和架构的质量。一般来说,拆分系统要遵守以下几个原则:(1)每个应用独立完成一个完整的业务逻辑(2)按照业务而不是按照用户角色来拆分系统(3)高内聚(4)低耦合。
系统拆分的好坏并没有可以量化的标准,很多时候需要经过多次迭代才能达到比较合理的划分。在开始的时候可以大胆一些,将系统拆分成尽可能多的应用,然后在开发过程中如果发现应用间交互很频繁,则可以将其合并为一个应用。
四、结束语
以上介绍了如何把一个复杂的Rails系统拆分成多个轻量级应用集群,这个框架结构在线英语学习平台的实践来看效果还是很令人满意的。由于框架提供了很多基础设施,搭建一个新应用的时间也大大缩短,例如用于跟踪学生学习状态的LPR(Learner Progress Report)一个人两周即开发完成并上线。
参考文献:
[1](印)沃哈著.《用Rails进行敏捷Web开发》2010科学出版社
[2](美)鲁比,(美)托马斯,著《Ruby on Rails实践之路》电子工业出版社
转载注明来源:https://www.xzbu.com/8/view-1604387.htm