处理模型

看完“实现模型”,你是否长吁一声,准备拿起咖啡,惬意的喝上一杯?毕竟我们已经完成了从用例到编码的全过程了,确实是值得庆祝的一件事情,但“革命尚未成功、同志还需努力”,现在还不是享受的时候,接下来我们需要进入“处理模型”阶段。

l         “处理模型”阶段的任务

“处理模型”英文是“Process Model”,Process在IT里面又叫“进程”,虽然和进程相关,但直接叫“进程模型”会误导大家,所以我叫它“处理模型”,也就是和处理相关的设计。我们来看看“处理模型”阶段的任务:

1)进程、线程设计;

2)子系统设计;

为什么需要“处理模型”呢?相信看到上面的任务后,聪明的你应该已经知道了原因:

1)随着系统规模增大,处理性能要求增加,必须采用多进程多线程处理方式;

2)随着系统规模增大,复杂度增加,加上需要考虑可扩展性、可测试性、可靠性等质量属性,必须采用“分而治之”的方式划分子系统(注意此时还不是架构设计,欲知详情,请关注下一篇博文);

l         为什么现在才开始进行进程、线程、架构设计?

讲到这里,估计很多朋友都有疑惑了:按照一般的经验,都是最开始就要进行子系统设计、进程线程设计的,怎么你的这个流程到现在才开始进行进程、线程、子系统设计呢?

我们知道:进程、线程、子系统设计都必须有基础,而不是凭空创造或者想象出来的。那种所谓的先画一个圈表示系统、然后再在这个圈下面画几个圈表示子系统、子系统下面再画几个圈表示进程或者线程的自顶向下的设计方式就像“浮沙筑高台”,其实是完全行不通的,为什么呢?

因为这个时候划分子系统没有任何可靠的依据。架构设计、子系统设计、进程线程设计主要是为了解决性能、可靠性、可扩展性、可测试性、安全性等质量属性,而不是客户主要关注的功能属性。性能、可靠性、安全性可以从客户获得,但无法像功能属性那样一步一步的映射到代码(客户说要“每秒支持10000个交易”,然后你画了三个圈,说“这样就可以达到每秒10000个交易”,谁会相信呢?),而可扩展性、可测试性在客户需求阶段根本不会体现。所以我们必须等到“实现模型”完了之后再进行进程、线程、子系统设计、架构设计。

可能大家还有疑问:按照你这个说法,岂不是要等到系统全部编码完成后再来进行进程、线程、架构设计?

回答这个问题的关键词就是“迭代”,第一个迭代(一般都叫做Demo)把最主要、最核心、最关键的需求按照“用例模型”->“领域模型”-> “设计模型”-> “实现模型”->“处理模型”走一遍流程,这样第一个迭代就可以把架构、子系统、进程、线程初步设计完毕,后续的迭代基本上只要走“用例模型”-> “设计模型”-> “实现模型”就可以了,即使有调整也不会太大,因为第一个迭代式把最主要、最核心、最关键的需求给实现了。

l         具体如何操作?

我们来看如何基于“实现模型”进行进程、线程、架构设计:

1)第一步:将已有的对象进行分组;

分组的原则其实就是大家常见的“高内聚、低耦合”,把最相关的、联系最紧密的对象划分到同一组;

2)第二步:将多个组划分为进程、线程;

将对象组再分组划分到具体的进程和线程,分组的原则主要看性能要求(响应时间、吞吐量),性能数据可以基于已有的“实现模型”进行评估或者测试。

3)第三步:设计进程的同步、通信;

既然是多进程、多线程,就必须设计出进程间同步和通信方式。

4)第四步:将进程划分到不同的子系统;

结合根据“高内聚、低耦合”的原则、以及性能、可靠性、可扩展性、可测试性等质量属性要求,将进程划分到不同的子系统;划分子系统也为下一个阶段(卖个关子,先不说:-P)打下了基础。

5)第五步:设计子系统间的同步、通信

和第三步类似,划分为不同的子系统后,必须设计子系统间的同步和通信方式。

看起来步骤比较多,不过每个步骤其实都不难,简单点说就是“排列组合”,将对象排列组合成进程线程,将进程排列组合成子系统。

千言万语不如一个用例,我们还是继续前面的POST机样例来看看“处理模型”阶段如何操作吧。

经过“实现模型”阶段后,我们的POST机可能是这样实现的:“商品”、“交易”、“商品管理”、“商品清单”、“付款方式”、“店铺”、“收银机”、“VIP会员”、“供货商”等对象了,接下来我们就要进行“处理模型”设计了:

1)第一步:将已有的对象进行分组;

1.1)“商品”“商品管理”都是商品相关的对象,因此划为第一组,命名为“商品处理”;

1.2)“交易”“商品清单”“付款方式”都是和交易相关的对象,因此划为第二组,命名为“交易处理”;

1.3)“店铺”、“收银机”都是系统静态信息,因此划为第三组,命名为“系统信息管理”;

1.4)“供货商”、“VIP会员”都是第三方的管理信息,因此划为第四组,命名为“第三方管理”

2)第二步:将多个组划分为进程、线程;

初步评估,“商品处理”和“交易处理”的性能要求会很高(因为商品很多,交易也在不断进行),而“系统信息”是一个基本静态的信息,性能要求会很低,而“第三方管理”性能要求相对也不高,因此可以设计出3个进程:“商品处理”进程、“交易处理”进程、“信息管理”进程,其中“信息管理”进程负责 “系统信息管理”和“第三方管理” 两组对象

3)第三步:设计进程的同步、通信;

进程间同步和通信和具体的实现有关,可以参考相关资料,例如Windows和Linux的可以参考我的博文《多核时代:并行程序设计探讨(4)——Windows和Linux对决(进程间通信)》http://blog.csdn.net/yunhua_lee/article/details/4409138

多核时代:并行程序设计探讨(5)——Windows和Linux对决(进程间同步)

4)第四步:将不同的进程划分到不同的子系统;

第二步已经设计出三个进程了(实际情况会更多):“商品处理”进程、“交易处理”进程、“信息管理”进程,因此可以划分为三个子系统:商品管理系统、交易系统、信息系统。其中“信息系统”负责“系统信息管理”和“第三方管理”。

注意:由于此样例比较简单,所以出现了进程和子系统一一对应的情况,实际工作中应该是一个子系统包含1至多个进程。

5)第五步:设计子系统间的同步、通信

和第三步类似,划分为不同的子系统后,必须设计子系统间的同步和通信方式。

由于子系统可以是进程、线程,也可以是独立运行的程序,因此子系统间通信方式也随着实现方式不同而不同。例如程序间通信可以采用共享文件、共享内存、Socket等方式。

时间: 2024-11-06 10:10:34

处理模型的相关文章

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

Laravel5.1 模型--ModelFactory

今天要说的是模型工厂,它是可以快速生成一些测试数据的东西,之前我们介绍过Seeder,当我们使用模型访问数据时 可以用模型工厂搭配Seeder使用. 1 编写一个ModelFactory ModelFactory的路径在 database/factories/ 下: // 这是系统自带的工厂 $factory->define(App\User::class, function ($faker) { return [ 'name' => $faker->name, 'email' =>

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

11.python并发入门(part13 了解事件驱动模型))

一.事件驱动模型的引入. 在引入事件驱动模型之前,首先来回顾一下传统的流水线式编程. 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各样事情的代码,但编程者知道代码块A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据.输入不同的数据,根据条件语句判断,流程或许就改为A--->C--->E...--->结束.每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和

Linux的I/O模式、事件驱动编程模型

大纲: (1)基础概念回顾 (2)Linux的I/O模式 (3)事件驱动编程模型 (4)select/poll/epoll的区别和Python示例 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1.基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内

Storm介绍及核心组件和编程模型

离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据.MapReduce批量计算数据.Hive批量计算数据.azkaban/oozie任务调度 流式计算 流式计算:数据实时产生.数据实时传输.数据实时计算.实时展示 代表技术:Flume实时获取数据.Kafka/metaq实时数据存储.Storm/JStorm实时数据计算.Redis实时结果缓存.持久化存储(mysql). 一句话总结:将源源不断产生的数据实时收集并实

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它

1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常,路由规则如下: (1)当前为EL1,则陷阱异常传递给EL1(HCR_EL2.TGE定义为1时,会路由到EL2); (2)当前为EL2,则陷阱异常传递给EL2; (3)当前为EL3,则陷阱异常传递给EL3; 3. 系统调用 SVC 默认情况下SVC产生supervisor call,同步异常目标级别

【统计学习】随机梯度下降法求解感知机模型

1. 感知机学习模型 感知机是一个二分类的线性分类问题,求解是使误分类点到超平面距离总和的损失函数最小化问题.采用的是随机梯度下降法,首先任意选取一个超平面w0和b0,然后用梯度下降法不断地极小化目标损失函数,极小化过程中不是一次使所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降.假设误分类点集合M是固定的,那么损失函数L(w,b)的梯度: 随机选取一个误分类点,对w和b进行更新: 其中n是步长,又称为学习率(learning rate),这样通过迭代可以使损失函数L(w,b)不

4.利用python生成器实现简单的“生产者消费者”模型

假如说,没有生成器这种对象,那么如何实现这种简单的"生产者消费者"模型呢? import time def producer(): pro_list = [] for i in range(10000): print "包子%s制作ing" %(i) time.sleep(0.5) pro_list.append("包子%s" %i) return pro_list def consumer(pro_list): for index,stuffe

Java实现多线程生产者消费模型及优化方案

生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 */class Resource { private String name; private int count = 1; //计数器,记录有多少只烤鸭被生产及消费 private boolean flag = false; //停止标记 public synchronized void set