重绘商旅逻辑架构有感

商旅系统一做就是三年,这期间系统由初建到流畅运行,架构上经历了许多次的重构和整理。重新回首,整理一下系统,谈谈自己对逻辑架构的设计实践的一些感想。

商旅系统前后逻辑图如下所示:

这张图是商旅系统最新整理系统逻辑图,与最初相比,有比较多有趣的地方,值得评鉴。

分层架构的清晰。

原有三层的分层架构依旧保留,进行了更进一步的抽象,比如系统管理平台和作业平台细分内容没有进行展示;将应用服务层CC的子系统框架模糊化,定义CC作业平台为渠道端子系统,其服务层和支撑层是子系统内部技术架构,不在总体逻辑架构图展示;对外联和业务系统所属服务进行了适当合并;数据层几乎全部重新定义。由于整个系统庞大,子系统众多,在每个分层类,进行了适当的主题与的划分,这些变更使得逻辑架构对于分层、子系统、模块的职责更为清晰。

使用层的本质思想有:1)将系统的大型逻辑结构组织为独立的、职责相关的离散层,清晰、内聚,并且关注分离;2)协作和耦合从较高层到较低层进行,避免从较低层到较高层的耦合。

使用层有助于解决下面的问题:1)源码的变更波及整个系统;2)应用逻辑和界面显示交织在一起,难以复用和分布;3)技术逻辑和业务逻辑交织在一起,难以复用、分布和替换;4)领域之间的高度耦合,难以为不同开发者清晰地界定和分配任务

关于分层的优劣也是一直存在争论,这里不做赘述。刀可伤人也可助人,关键看怎么用。架构设计上,使用分层是有助于进一步理解系统,就是达到了目的。后面的逻辑架构图,也还需要进一步完善。分层内一个个方框代表的子系统,粗细粒度大致相当,但还有一些较粗的可进一步展开,如作业平台和网站,规模是比较大的,可以再次横向分层;业务数据等数据库,可以通过Schema纵向划分。

数据层的问题。

从前后的架构图相比,数据层新增的东西比较多,变动最多的地方往往也是问题的最多的地方。运行过程中数据库的许多问题,与逻辑架构设计关联的有以下几个。

第一个问题是业务数据和非业务数据的划分,定义不够明确,也就是数据的纵向分层规划。这可能是由于项目组织架构的关系,我们是分组开发,每个开发组依照自己的经验和习惯,对业务数据和非业务数据进行分解存放;还有对公用数据的引用、关联和映射,比较混乱,使得在数据库这块有不少的关联结。

第二个问题是在数据层的划分中,遗漏了文件数据、缓存数据和报表结算数据的分离。首先是文件数据,开发、测试过程都是单点,而部署是多点,这样很多存放于应用服务器的文件没有办法被其他节点共享;然后访问的方式有的是通过流的方式读取,有的是通过HTTP的站点访问,还需要一些专门的文件同步工具在前后端子系统之间进行文件同步。这些处理过于复杂,导致运维同事经常报故障说XXX文件又点不开了,或者无法下载。缓存和报表、结算库的分离是与性能有关的,最初设计中的忽略,于是大家在开发的时候,复杂的低频率而又需要长时间计算运行的业务逻辑和简单的逻辑一起放到了主库中,业务高峰时段会导致CPU消耗达到100%,耗掉硬件资源,从而影响正常业务运行。

职责间协作。

逻辑架构关心的不仅仅是如何将系统分为不同部分,还关心各部分之间是如何交互的。而识别协作,并将具有共性的协作抽象成通用机制,是逻辑架构设计的重点和难点。前面的图里未做描述,从最新的图来看,渠道层和服务层之间,是通过远程调用,走的是Hessian协议;服务层和数据层之间是方法调用,利用了JDBC等中间件技术。层与层之间的分离是比较清晰的。实际的运行过程中,服务层的各个子系统,也需要相互调用,数据层各单元也存在着同步数据的链接,层内部的协作,较难抽象出新的连接件逻辑单元,目前通用的方法是如果存在交叉调用,就继续往下放到数据层。比如营销和客户两个服务需要相互调用,那么往往委托给存储过程实现,分层和分离难以协调的少部分逻辑,放在数据库实现里解决,取一个平衡。

关于逻辑架构设计。

逻辑架构重在描述系统的职责划分和职责间的协作关系,它是软件的宏观组织结构。之所以称为逻辑架构,是因为并未决定如何在不同的操作系统进程或网络中物理的计算机上对这些与元素进行部署。

层和子系统的粗细粒度,需要考虑在建系统的特点。根据系统大小,逻辑结构可以大到分层和子系统,也可以小到模块或者一个个的类。但不管如何划分,需要针对系统的主要组成部分,强调内聚的职责。还需要描述层次的调用原则,如较高层可以调用较低层,反之则不然。

严格的分层架构中,层只能调用与其相邻的下层的服务,一般用于网络协议应用。而在商旅这样的信息系统中,我们采用了比较宽松的分层架构,较高的层可以调用其下任何层的服务。

逻辑架构的最佳来源是用例分析。基于用例的分析方法会使逻辑架构的设计变得有序——通过对每个关键用例的分析,从逻辑上将用例实现为一组功能块的特定组合,最后综合这些用例分析成果,将一个个独立的协作归纳合并成整个软件系统的逻辑架构。而在用例分析方法产生之前,功能模块的确定多多少少带有些“硬”想出来的味道,特别是并不直接承载业务功能的模块有时比较容易遗漏,直到大规模编程实现阶段才发现。

时间: 2024-10-12 07:28:41

重绘商旅逻辑架构有感的相关文章

Android视图状态及重绘流程分析,带你一步步深入了解View(三)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在 前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程,了解了视图绘制流程中onMeasure.onLayout.onDraw这三个最 重要步骤的工作原理,那么今天我们将继续对View进行深入探究,学习一下视图状态以及重绘方面的知识.如果你还没有看过我前面一篇文章,可以先去阅读 Android视图绘制流程完全解析,带你一步步深入了解View(二) .

浏览器渲染页面的过程,以及重排和重绘(转)

前言 写得比我的文字好,有逻辑! 浏览器的渲染过程 1,浏览器解析html源码,然后创建一个 DOM树.在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点.DOM树的根节点就是 documentElement,对应的是html标签. 2,浏览器解析CSS代码,计算出最终的样式数据.对CSS代码中非法的语法她会直接忽略掉.解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置,用户设置,外链样式,内联样式,html中的style. 3,构建出DOM树,

【Fanvas技术解密】HTML5 canvas实现脏区重绘

先说明一下,fanvas是笔者在企鹅公司开发的,即将开源的flash转canvas工具. 脏区重绘(dirty rectangle)并不是一门新鲜的技术了,这在最早2D游戏诞生的时候就已经存在. 复杂的术语或概念就不多说,简单说,脏区重绘就是每一帧绘制图形界面的时候,只重新绘制有变化的区域,而不是全屏刷新.很明显,这肯定能带来性能的提升. 举个例子,看下边两个图:   假设这里是动画的连续2帧,那么从第一帧到第二帧,其实变化的只有蝴蝶的区域.那么所谓的脏区就是两个图片的红色框之和,要把上一帧的蝴

Re:从0开始的微服务架构:(一)重识微服务架构--转

原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage 导语 虽然已经红了很久,但是“微服务架构”正变得越来越重要,也将继续火下去. 各个公司与技术人员都在分享微服务架构的相关知识与实践经验,但我

页面重绘与重排版的性能影响

DOM树和渲染树 当浏览器下载完所有页面HTML 标记,JavaScript,CSS,图片之后,它解析文件并创建两个内部数据结构:一棵DOM树表示页面结构,一棵渲染树表示DOM节点如何显示.      渲染树中为每个需要显示的DOM 树节点存放至少一个节点(隐藏DOM 元素在渲染树中没有对应节点).渲染树上的节点称为“框”或者“盒”,符合CSS 模型的定义,将页面元素看作一个具有填充.边距.边框和位置的盒.一旦DOM 树和渲染树构造完毕,浏览器就可以显示(绘制)页面上的元素了. 重排版 当DOM

【REACT NATIVE 系列教程之六】重写SHOULDCOMPONENTUPDATE指定组件是否进行重绘

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2252.html 前几天,Himi 写练手项目时,遇到子更新父state中的某一个属性值,且对父进行重绘时,父包含的所有子组件都进行重绘 – -- 非常尴尬. 查阅了RN文档,终于在生命周期篇看到了想要的答案. 仔细看过RN关于生命周期篇的童鞋应该知道,就是它:shouldComponentUpdate 官方解释此函

easyUI重绘combobox中下拉箭头

下午群里一个朋友问了我一个问题,她行要重绘combobox的下拉箭头.我当时第一想法就是让她把原生的图标替换不就好了嘛.可人家又说,要单选和多选的下拉箭头图标是不一样的.一段时间没用也不知道easyUI有没有给combobox开这个口子的,于是看了看文档,发现没有.那么看样子只能看源码咯,不过combo没有源码,只有变态的"_1,_2"命名的版本: if(_4.hasDownArrow){ _6.push({iconCls:"combo-arrow",handler

(转)Android视图状态及重绘流程分析,带你一步步深入了解View(三)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程,了解了视图绘制流程中onMeasure.onLayout.onDraw这三个最重要步骤的工作原理,那么今天我们将继续对View进行深入探究,学习一下视图状态以及重绘方面的知识.如果你还没有看过我前面一篇文章,可以先去阅读 Android视图绘制流程完全解析,带你一步步深入了解View(二) . 相信

从0开始的微服务架构:(一)重识微服务架构

导语 虽然已经红了很久,但是"微服务架构"正变得越来越重要,也将继续火下去. 各个公司与技术人员都在分享微服务架构的相关知识与实践经验,但我们发现,目前网上的这些相关文章中,要么上来就是很有借鉴意义的干货,要么就是以高端的专业术语来讲述何为微服务架构.就是没有一个做到成熟地将技术传播出来,同时完美地照顾"初入微服务领域人员",从0开始,采用通俗易懂的语言去讲解微服务架构的系列. 所以,我们邀请青柳云的苏槐与InfoQ一起共建微服务架构专题"Re:从0开始的