`
ideage
  • 浏览: 326232 次
社区版块
存档分类
最新评论

多进程的架构方法(转)

阅读更多
       做了4、5年的开发,大大小小的项目也做了不少,但以前都有一个致命的问题,不知不觉就会写出一个巨大的主程序出来,层次复杂,编码痛苦,调试困难。但似乎大家都认同这样的开发方式,虽然都知道界面和功能分离是好事情,但就是做不到。我自己也曾痛苦的思考过,但没有什么收效,似乎在Windows下的开发只能是这么痛苦。   
一星期前买了<<unix编程艺术>>,这一周可谓改天换地,每天都在阅读和思考中度过,想必武侠小说中的武功大进也就是这个意思了。虽然书还没看完,但是有些话实在是不吐不快。
   
       什么是界面?界面就是功能的子集。没有哪个界面能反映所有的功能,但是若没有界面,对于最终用户来说又是不可忍受的,无论如何都不能指望让一个门卫学会输入复杂的命令来完成工作,虽然最终用户也包括专业人士,但这世界上终究普通人更多。在这样的前提下,可以认为功能永远比界面更宽泛,更有适应性,而GUI更狭窄,更具有特殊性,所以将界面和功能进行分拆也就成为一种必然趋势。   
 
       但是如何分拆?在Windows的世界里,一个普遍观点就是DLL。DLL很好,但是还不够好,因为无法直接使用、调试以及升级,带来的问题远比好处多。另一种方法就是在代码级进行分层,比如GUI一层,功能一层,再用胶合层将二者整合。且不论胶合层的不可复用和调试困难,就一条,如何能做到GUI崩溃的时候却不影响功能的实现?以前我做过的项目都是这样处理的,直接的后果就是项目越到后期问题越多,代码越不接受变化。调试花费了大量的人力物力,收效却未必好,功能的一点点小修改就会造成代码里出现意大利面条。你可以说只要前期的小心规划和仔细架构就能避免这些问题,但是谁能准确预测未来?无论做怎样的努力,你也不能保证现在的功能永远不变,永远不变的恰恰就是变。如果不能保持实现的稳定性和较好的移植性,这样的项目下场一般都不太好。   
说了这么多废话,还是赶紧进入正题。谈谈这一周来的心得体会!  
 
       首先,变化是渐进的,非突变式的。如果能将变化的所在约束在一个比较小的代码范围内,修改就不会成为噩梦。怎么约束?就一个要求:在保证完整性的条件下让每个模块包含的功能尽量单一和足够小。首先是保证完整性,不是代码足够短,包含的实现足够少就是完整,要达到完整,就要让模块的各个部分做到不可分割和无需添加,按照古人的说法,就是增一分则太多,减一分则太少。这个要求虽然看起来很好理解,其实并没有什么标准答案,每个人心里都有自己的回答,正所谓仁者见仁,智者见智。其次是单一化和小型化,一般来说,范围太大的东西会造成人脑覆盖不全,比如一个功能,如果牵扯的部分过多,就会造成从底层到中间层,再到上层,全部都要思考到,估计没有几个人能做到,即使做到了,将来的维护和修改也会变成噩梦。相反,只要功能的涉及面够窄,就很容易进行思考和修改,这个道理应该没有什么问题。  
 
      既然要保证模块单一、小型化和保证完整,也就意味着这个模块可以认为是一个完整而单独的程序,无需外围程序的支持就可以单独运行和测试。从而引出我的最重要的观点:尽量用多进程来分拆程序。在Windows的世界里,多进程似乎是天生被忽略和鄙视的,从unix的观点看,其主要原因是Windows的设计中对进程的快速创建支持不够,造成对多进程的天然排斥和害怕。但是换一个思路看,多进程也许是目前最好的架构方式。底层的功能分拆成各个进程单独运行,通过ipc和上层的GUI进行交互,胶合层薄了,移植性增强了,调试容易了,功能演进也不再成为噩梦。需求永远是渐变的,所以进程的渐变也就成为可控的行为。   
       多进程间的传递方式一般有这么几种:共享内存,管道(pipe),信号,消息, socket。其中共享内存适宜于大量数据的即时传递,速度快,容量大。但使用共享内存时需要仔细考虑读写冲突问题,一般的解决办法是用全局锁,但是锁的存在必然会造成效率的下降,所以能不用锁就尽量不要用。pipe的速度和容量都没有共享内存好,但是用来传递命令和返回值还是很适合的。信号和消息的方式一般会和操作系统联系紧密,个人不太喜欢。最后是socket,对于异地交互而言,socket是目前很常用的手段,甚至本地进程间通讯也可以使用。但是由于和网络有关,所以同步性不好保证,需要辩证的使用。   说了这么多,举个例子说明一下。假设现在要做一套点菜软件供酒店使用,其基本功能包括人员管理,桌台管理,点菜管理,结账以及后台管理五个功能模块。按照单进程的方式就是将所有功能整合在一起,系统启动时加载所有的功能,一旦某个模块出现问题,则必须重新启动程序,而且各个模块之间很容易发生资源冲突和请求冲突。如果换成多进程方式,让我们看看有什么不同。首先是所有的功能最终目的地都是数据库,那么可以开发一个后台进程专门所有负责针对数据库的请求,通过pipe或者共享内存来接收命令和返回结果,那么程序或者说具体代码块之间的接口就是单一的pipe或共享内存了。同时,即使某一个程序运行错误也不会造成整体失败,只需要重起失败的部分即可。当然了,这种方式下存在一个问题,就是效率的降低,但是对于大多数的应用来说,稳定性的提高远比效率的降低要重要,而且随着硬件水平的不断提高,效率总是可以达标的。   
       数据库处理分拆出去后,剩下的就很好处理了,人员、点菜、桌台等管理模块都作为单独的后台程序出现,最后GUI部分只需要和各个共享内存和pipe打交道即可,无需只要具体的逻辑处理和功能实现,而且各个后台程序还可以复用,比如人员管理可以挪到客房服务系统中,甚至是其他系统。GUI随时可以替换,实现了功能和界面的分离,同时系统崩溃的几率大大降低,升级和售后也方便很多,永远不要把最终用户想的太愚蠢,很多时候人们还是蛮有求知欲的。   
更多的细节需要自己整理,这里只是给出了一个框架,起码我现在的项目已经开始这样做,效果嘛,半年后知道了。
.
分享到:
评论

相关推荐

    详解主流浏览器多进程架构:Chrome、IE

    ### 详解主流浏览器多进程架构:Chrome、IE 随着互联网技术的飞速发展,Web浏览器已成为现代生活中不可或缺的一部分。然而,网络安全威胁也随之增加,包括恶意软件、木马、间谍软件等,对用户的安全和隐私构成了...

    王志刚:浏览器的多进程架构与渲染优化

    标题中提到的“浏览器的多进程架构与渲染优化”指的是现代浏览器采用的一种架构模式,旨在提高浏览器的性能、稳定性和安全性。浏览器作为用户访问网络资源的重要窗口,其性能直接关系到用户的上网体验。多进程架构...

    Android开发之多进程架构 任玉刚.pdf

    ### Android开发之多进程架构 #### Android应用开发现状 在Android应用开发现状中,开发者面临多种挑战。首先,由于Android应用运行在Dalvik虚拟机上,默认情况下每个应用运行在单一进程中,这使得应用的内存使用受...

    C#多进程浏览器-仿Chrome浏览器

    "C#多进程浏览器-仿Chrome浏览器"是一个项目,它旨在模仿Google Chrome浏览器的设计理念,利用C#来实现一个支持多进程架构的浏览器。这个项目名为"MultiProcessArchitectureDemo-master",显然关注的是多进程架构这...

    duilib多进程浏览器

    这个浏览器的设计理念是为了提高稳定性、安全性和性能,通过采用多进程架构来实现这些目标。多进程架构是现代浏览器的一个核心特性,它将不同的浏览器功能分散到多个独立的进程中,从而避免一个进程崩溃影响整个...

    软件架构方法.ppt

    《软件架构方法》 在IT行业中,软件架构是构建复杂软件系统的核心环节,它定义了系统的组织结构和组件,以及这些组件之间的相互关系。软件架构方法则是指导如何设计和实施这些架构的一系列原则、模式和实践。本资料...

    嵌入式linux多进程应用程序的设计与实现 (1).pdf

    通过对多进程和多线程的比较,文章指出在实际编程中应该根据情况选择适合的方法。同时,文章还讨论了多进程在Linux系统下的设计和实现,包括进程的概念、fork函数的使用、进程间的通信和同步等方面。 1. 进程的概念...

    Oracle 简明进程架构

    ### Oracle简明进程架构详解 #### 一、进程体系结构概览 Oracle数据库采用复杂的进程架构来支持高效的数据管理和并发处理。本章节将详细介绍Oracle进程体系结构的基本概念、主要组件及其工作原理。 #### 二、进程...

    gdb 多进程程序调试

    ### gdb多进程程序调试 在IT领域中,特别是软件开发过程中,调试是不可或缺的一个环节。对于复杂的多进程程序而言,有效的调试工具和技术更是至关重要。本文将深入探讨如何使用GNU调试器(gdb)来调试多进程程序,...

    Google 浏览器Chrome 那么多进程怎么办?.docx

    Chrome 浏览器使用多进程架构,每个标签页对应一个独立的进程,以便提高浏览器的稳定性和安全性。当打开新标签页时,Chrome 浏览器会创建一个新的进程,作为该标签页的容器,以便在出现崩溃或异常情况下,影响最小化...

    软件系统架构的方法论

    软件系统架构的方法论是构建大型复杂软件系统的关键步骤,它涉及到多个层次的抽象和决策,旨在确保系统的稳定性和可扩展性。系统架构可以分为几个主要的视图:逻辑架构、开发架构、运行架构和数据架构。 逻辑架构...

    基于 51 单片机 多进程 多任务 纯 C语言 调度 程序

    基于 51 单片机 多进程 多任务 纯 C语言 实现 死循环 调度 多任务 调度程序

    PHP-多进程编程示例代码

    2. **Master-Worker进程模型**:这是一种常见的多进程架构,主要由一个Master进程和多个Worker进程组成。Master进程主要负责管理和调度Worker进程,而Worker进程则执行实际的工作任务。在PHP中,Master进程会创建...

    多进程多线程在数据采集处理的应用设计

    为了克服传统设计结构的局限性,提出了基于多进程多线程的并行处理架构。这种架构不仅能够满足复杂功能的需求,还提供了良好的扩展性和资源利用率。在新的架构中,系统创设了两个并行处理的进程:服务进程和数据采样...

    cef 多进程 JS通讯 的开发

    这个资源专注于CEF的多进程架构以及JavaScript与C++之间的通信,这对于创建复杂的桌面应用或者实现定制化的Web渲染非常有用。下面我们将深入探讨这些知识点。 首先,CEF的多进程架构是基于Google Chrome的多进程...

    ArchSummit北京2016-58-微服务架构在转转中的实践-sunxuan.pdf

    微服务架构是一种将单一应用程序开发为一组小服务的方法,每个服务都运行在其独立的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。这种架构模式具有以下几个显著特点: 1. **微服务粒度**:服务的规模...

    信息化总体架构方法论.pdf

    信息化总体架构方法论,也就是企业架构(EA),是现代企业管理和信息技术发展中的重要概念。企业架构是为企业或组织提供一种管理框架,确保企业能够有效地使用信息技术来支持其业务战略和目标。它涉及了从制定企业...

Global site tag (gtag.js) - Google Analytics