系统设计几方面

1. 具象: 几个角色 -- 用例

2. 具象: 边界模块

3. 具象: 实体模块

4. 抽象: 详细设计后,抽出公用的部分.

5.

Status状态字段的设置和更改

系统设计中最核心的是异常设计.

如何?

有哪些异常

1. 通信失败

2. 实体失败

方法论:

1. 确定一个实体生命周的实体交互图. (可以是实体交互图,也可以是时序图) 先抛弃状态检查等.

2. 确定每个流程中的异常问题.

3. 区分. 明确状态 和 中间状态[不明确状态,例如超时状态][  开锁中, 支付中 ,超时状态] 本质上其实并不需要. 可以查看支付失败的原因,开锁失败的原因.

4. 并发问题. 乘客结束订单,司机抢单成功. 加分布式锁.

5. 保护权衡(分布式事务,抽象总结): 1. 保护资产. ( 先减款,再退钱 ) 2. 保护资产: 等开锁消息回来再结束计费 3. 保护乘客:

举例说明.

评审: 说服别人要明确举出工作中的缺点, 不要直说原则. 业务域就放业务域.   例如业务域不明确,增加一项,或者改变某个逻辑,大家都要改. cos 组合服务太重,

状态设计的需求来源:

1. 业务流程.

参考流程引擎的各种流程 . 垫付的流程更复杂,  1.支付 2.垫付  不仅独立而且共存. 但都会触发 分润. [         各个主体的认知梳理. 乘客,司机 (单流程 key value),客服,财务统计. 各个统计需求真的关注的到底是什么? 原状态流程不变,那么司机要重新对原 status 字段的判断要改. 司机也要改. ]

2. 后台查询诉求

1. 可能全局系统(n 个子系统)的状态, 全流程. 方便 crm 同学查询. 2.将内部系统的 n 个状态聚合成一个状态.  ( 已分润也算已支付.)

3. 统计诉求

对状态进行聚合统计. 新增状态要同步. 状态字典 加上 监控 ,对新增的状态进行监控.

代码级别就只能 review 了? 状态转换表. 不同业务场景下.

新增的 type,status 如何保证业务系统健全.

状态设计是误区.一定要是状态机设计. 相同状态但流程不同. 状态机是实体和流程的统一.

一定要前置状态校验和其他条件校验.

异常考虑: 另外要关注自动流转的状态,要警惕丢失掉对应的流转流程. (例子,代保养中 大单结束)

几种状态设计.

顺序流程:

1.  单系统 一个字段表征 N 个状态( 含 手动,含自动)

2. 分布式系统. 每个系统各一个字段.对应着生命周期扩展表.

顺序流程:

多个主体操作.

例子. 1. 发单, 乘客取消, 多个司机抢单. 2.tcp 状态机 关闭流程.  ack 的和 action 可能组合,

复杂流程:

N 个流程,独立. 有一个成功即走下去.

N 个流程,x 个都成功才能走下去.

N 个流程 x 个成功就能走下去, 但是不妨碍剩下的action 执行.

action 变成了实体, 不再是依附于状态节点. 或者是一个字段来表征也可以.

1. 每个实体都需要有状态

2. 当两个实体不是同时存在的时候,即使1:1也无法用下游实体代替上游实体的状态;

例如 订单行 ad 1:1 先有订单行 后有ad ;

如果只是把 订单行的状态设置在ad上; 那么你无法获取订单行是初始状态的情况( 订单行 left join ad 后 ad.status=null 或者 ad.status=Init 两种情况,这种很难考虑到)

3. 上游的状态是根据上游状态计算出来的,

一个计算技巧就是,当所有下有状态是Audited, 那么上游的Ad是什么状态,利用这个, 再根据 if else的逐位分析法,逐步判断;;

wiz上有详细.

1. status一定要有状态机更改

2. status状态的意义是屏蔽掉复杂业务.

比如说分润状态流转.有些是有三条流水,有些是有四条流水.

业务系统中最核心的状态设计,异常 case. (系统设计)的更多相关文章

  1. 聊聊业务系统中投递消息到mq的几种方式

    背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...

  2. 架构设计 | 分布式业务系统中,全局ID生成策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...

  3. Mycat中的核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  4. 整合Activiti Modeler到业务系统(或BPM平台)

    http://www.kafeitu.me/activiti/2013/03/10/integrate-activiti-modeler.html 1. 为什么要整合 Activiti 5.10版本把 ...

  5. 系统中异常公共处理模块 in spring boot

    最近在用spring boot 做微服务,所以对于异常信息的 [友好展示]有要求,我设计了两点: 一. 在业务逻辑代码中,异常的抛出 我做了限定,一般只会是三种: 1. OmcException // ...

  6. 如何在CRM系统中集成ActiveReports最终报表设计器

    有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...

  7. [Hyperledger] Fabric系统中 peer模块的 gossip服务详解

    最近一直在看fabric系统中的核心模块之一——peer模块.在看peer的配置文件core.yaml的信息时,对其中的gossip配置选项很感兴趣.看了一上午,还是不能明白这个选项到底什么意思呢?表 ...

  8. 统一门户与业务系统的sso整合技术方案(单点登录)

    一.单点登录(SSO,Single Sign On)整合目前计划接入统一门户的所有业务系统均为基于JavaEE技术的B/S架构系统.由于统一门户的单点登录技术选用的是JA-SIG组织开发的Cas Se ...

  9. 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化

    背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...

随机推荐

  1. npm,cnpm,nrm区别

    npm npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) nrm nrm只是单纯的提供了几个常用的下载包的uri地址,并能 ...

  2. StringUitl工具类中的一种写法

    typeHandlersPackageArray = StringUtils.tokenizeToStringArray(this.typeAliasesPackage, ",; \t\n& ...

  3. 初入Three.js 第一章

    一.什么是WebGL? 1.WebGL是在浏览器中实现三维效果的一套规范. 二.什么是threejs? 1.你将它理解成three + js就可以了.three表示3D的意思,js表示javascri ...

  4. linux mysql乱码问题

    mysql,发现都是乱码,一堆问号,如下图: 查看mysql编码 需要修改mysql编码,打开/etc/my.cnf 文件 在下边添加如下行 [client] default_character_se ...

  5. JVM加载类的原理机制

    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.链接和初始化,其中链接又可以分成校验.准备.解析装载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析 ...

  6. 字典转json

    1.字典转json -(NSString*)dictionaryToJson:(NSDictionary *)dic { NSError *parseError = nil; NSData *json ...

  7. C# 面向对象之封装

    封装是指将类的内部数据隐藏起来不让对象实例直接对其操作,C#中提供了属性机制来对类内部的状态进行操作. 在C#中封装可以通过public.private.protected和internal等关键字来 ...

  8. python 基础(六) 推导式

    列表推导式 概念:提供了一种创建列表的简单快速的途径 (1) 一般形式 myList = [x for x in range(10)] ​ #分解后 myList = [] for x in rang ...

  9. 转:php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  10. shell与aw的简单交互示例

    先来看一段shell代码 word=“a test name” selectword=“test"lineitem=`echo "$word" | awk 'match( ...