什么是流程/规则编排?

所谓编排,就是让已有的节点通过不同的组织方式完成不同的需求。

首先,我们需要对既有业务做一定程度的抽象,以一个例子开始:
一个简单的国庆节充值活动:

活动时间 10.1-10.7
充值≥100 元,送 5 元余额
充值≥50 元,送 10 积分,10.5 之后开始

不叠加送, 即充 100 元只送 5 元余额不会叠加再送 10 积分

当充值发生时,我们拥有:充值用户-uid,充值金额-cost,充值时间-time
再有一些制作好的抽象节点,如:

  • 判断充值≥100 的条件节点 ScoreFlow-100,cost≥100 返回 true,否则返回 false
  • 判断充值≥50 的条件节点 ScoreFlow-50,cost≥50 返回 true,否则返回 false
  • 发放 5 元余额的结果节点 AmountResult,结果也可以有返回,比如正常发放了返回 true,库存不足了等原因导致的没有发放(不是
    error),可以返回 false
  • 发放 10 元积分的结果节点 PointResult

那么,为什么要编排,如何编排才是最优的?

为什么要编排?

**屏蔽代码影响:**比如编排者只需要知道 AmountResult 是发放余额的节点,然后在适当的位置运行这个节点即可,不需要关心真实的代码逻辑

**提升效率:**结合可视化给非研发人员编排实现业务逻辑,支持动态修改与生效配置,比如充值条件 100 元改成 200,结合可视化工具直接修改,解放研发,提升生产效率

如何编排?

流程图式编排


脑海里最先出现的编排方式,也是最常见的编排方式

执行树式编排

When X Then Y

以上两种基本代表了传统的编排思想,在简单的例子下,看起来也是非常直观,但,当变动发生时,尤其是需要灵活调整的场景,他们的表现又如何呢?

变动

①简单配置修改

充值 100 元改成 80 吧,10 积分变 20 积分吧,时间改成 10.9 号结束吧(**微微一笑,**毕竟我费了这么大劲,终于体现到价值了!)

②简单逻辑变动

用户参与积极性不高啊,去掉不叠加送吧,都送(**稍加思索,**费几个脑细胞挪一挪还是可以的,怎么也比改代码再上线强吧!)

③进阶逻辑变动

5元余额不能送太多,设置个库存100个吧,对了,库存不足了充100元还是得送10积分的哈(**卒…**早知道还不如硬编码了)

真实线上变动只会更离谱,流程图式和执行树式实现的主要缺点在于,牵一发而动全身,改动一个节点需要瞻前顾后,如果考虑不到位,很容易弄错,现实的活动内容要比例子复杂的多,时间线也是多条,考虑到这,再加上使用学习框架的成本,往往得不偿失,到头来发现还不如硬编码

那么,有没有更好的编排逻辑?

ice是如何编排的


如图,ice使用关系节点作为逻辑传递的桥梁,用树图方式呈现逻辑

关系节点(逻辑节点)

控制业务流转,如:

AND: 从上到下执行子节点,遇到第一个false中断并返回false,全部为true则返回true,类似于 Java 的 &&
ANY: 从上到下执行子节点,遇到第一个True中断并返回true,全部为false则返回false,类似于 Java 的 ||
ALL: 从上到下执行所有子节点

叶子节点(业务节点)

真正做事情的节点,如:

Flow: 一些条件与规则节点,如ScoreFlow
Result: 一些结果性质的节点,如AmountResult,PointResult
None: 一些不会干预流程的节点,如下文会介绍到的TimeChangeNone

执行流程

图中,如果10月4日,充值100元,则执行流程为:

  1. 从根节点开始,先执行ANY
  2. 充值时间在ANY生效时间内,继续执行
  3. ANY有两个子节点,先执行第一个子节点AND
  4. AND有两个子节点,先执行第一个子节点ScoreFlow-100
  5. ScoreFlow-100判断并返回true
  6. AND接收到true,继续向下执行AmountResult
  7. AmountResult发放余额并返回true
  8. AND子节点执行完毕,接收到两个true,自己也返回true
  9. ANY接收到true,不再继续执行子节点并返回true

可以看到,之前需要剥离出的时间,已经融合到各个节点上了,把时间配置还给节点,如果没到执行时间,如发放积分的节点 10月5日之后才生效,那么在 10月5日之前,可以理解为这个节点不存在

变动的解决

对于直接修改节点配置就可以

对于直接把ANY 改成 ALL 即可(叠加送与不叠加送的逻辑在这个节点上,属于这个节点的逻辑就该由这个节点去解决)

对于由于库存的不足,相当于没有给用户发放,则 AmountResult 返回 false,流程还会继续向下执行,不用做任何更改

再加一个棘手的问题,当时间线复杂时,测试工作以及测试并发要怎么做?

一个 10月1日开始的活动,一定是在 10月1日之前开发上线完毕,如我在 9月15日要怎么去测试一个10月1日开始的活动?在 ice 中,只需要稍微修改一下:

增加了个子节点TimeChangeNone(用于更改测试环境请求里的充值时间,可以改成任意想要的测试时间)

特性

为什么这么编排呢?为什么这样就能解决这些变动与问题呢?

其实,就是使用树形结构解耦,流程图式和执行树式实现在改动逻辑的时候,需要瞻前顾后,但是 ice 不需要,ice 的业务逻辑都在本节点上,每一个节点都可以代表单一逻辑,比如我改不叠加送变成叠加送这一逻辑就只限制在那个 ANY 节点逻辑上,只要把它改成我想要的逻辑即可,至于子节点有哪些,不用特别在意,节点之间通过上下文传递信息,每个节点执行完的后续流程不需要自己指定

因为自己执行完后的执行流程不再由自己掌控,还可以做到对象级别的复用:

如图,参与活动这里用到的 TimeChangeNone,如果现在还有个 H5 页面需要做呈现,不同的呈现也与时间相关,怎么办?只需要在呈现活动这里使用同一个节点对象(在ice后台配置中为同id节点),更改其中一个,另一个也会被更新(因为他们是同一个对象,不存在多个复用节点同步问题),避免了到处修改时间

Code

Talk is cheap. Show me the code…

官方文档:http://waitmoon.com/zh/

GitHub:https://github.com/zjn-zjn/ice

Gitee:https://gitee.com/waitmoon/ice

有更好想法或者更多应用场景或者想一起探讨的小伙伴~ 欢迎交流~

编排流程/规则,编排本身也需要很深的逻辑思考相关推荐

  1. 20条职场潜规则!小心那些城府很深的人(建议收藏)

    1.不要小看任何人,特别是那些老实人,因为他们有意想不到的力量和隐秘绝招 2.枪打出头鸟,做人切勿过分高调.炫耀.低调做人.高调做事,永远是做好的社交方式,记住:你的品行最重要.越是成功的人,往往做人 ...

  2. 低代码平台--基于surging开发微服务编排流程引擎构思

    前言 京东优惠券 https://m.fenfaw.net/ 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微 ...

  3. SAP MM 盘点流程中上不了台面却很实用的方案建议

    SAP MM 盘点流程中上不了台面却很实用的方案建议 SAP项目里,往往少不了MM模块,启用了MM模块就少不了盘点流程. 业务实践中,对于盘点业务,一般作业流程是: 根据企业管理策略,确定需要盘点的物 ...

  4. 什么是容器编排及容器编排是怎么工作的?

    容器编排自动化部署.管理.弹性伸缩和容器网络管理.需要管理数百个Linux和主机的企业将从容器编排中受益匪浅.无论在何种环境中使用容器编排,都可以使用它,它可以帮助您在不同的环境中部署相同的应用程序, ...

  5. 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

    本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug. 于是笔者将这个故事-哦不 -事 ...

  6. 水很深的深度学习-Task03前馈神经网络

    本文参考 Datawhale:水很深的深度学习 深度学习(四)-前馈神经网络_未名湖畔的落叶-CSDN博客_前馈神经网络 神经元模型   在前馈神经网络中,各神经元分别属于不同的层.每一层的神经元可以 ...

  7. 兔子吃狼的故事,看了就知道其中很深的哲理

    兔子吃狼的故事,看了就知道其中很深的哲理 http://blog.sina.com.cn/weicb无水也温柔de鱼 一天,一只兔子在山洞前写文章, 一只狼走了过来,问:"兔子啊,你在干什么 ...

  8. 【组队学习】【31期】水很深的深度学习

    水很深的深度学习 航路开辟者:刘洋 领航员:陈宇 航海士:刘洋.陈陟原.左凯文.初晓宇.刘羽中 基本信息 开源内容:https://github.com/datawhalechina/unusual- ...

  9. 水很深,我还是下去了

    blog.51cto.仰慕很久,受惠很久,卧龙藏虎,水很深,我还是下去了....... 开博第一篇 转载于:https://blog.51cto.com/20100823/381858

最新文章

  1. java常用的集合对象_java常用实体类、集合类
  2. 最佳页面置换算法代码_(存储管理)页面置换算法
  3. 网络资源(4) - extJS视频
  4. hadoop 2.x安装:不能加载本地库 - 解决libc.so.6 version GLIBC_2.14 not found问题
  5. 学习PetShop3.0(3)模仿购物车的简单可变类
  6. python遇到一个问题_新手学习python遇到的问题
  7. mysql停电后无法启动不了_急求mysql 断电后无法启动解决方法!!!!
  8. Linux下如何高效删除一个几十G的文本文件的最后一行或几行
  9. vs2005之主题与皮肤的学习
  10. 【渝粤题库】国家开放大学2021春3990产品管理题目
  11. DecimalFormat的几种用法!关于字符串的使用
  12. 数据中心能耗支出飙升,我们是否真的无能为力?
  13. redis rdb aof区别_Redis的持久化机制:RDB和AOF
  14. Can Place Flowers
  15. c语言两位数码管动态显示,十天学会单片机和c语言编程数码管动态显示.pptx
  16. typora插入文件到服务器,写作神器Typora入门指南
  17. Python 爬虫之初体验(实习僧)
  18. MATLAB2014a的安装
  19. 博途PLC 1200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)
  20. Lateral View Outer

热门文章

  1. pl_slam配置、运行过程
  2. 在一个数组中找到几个数之和为某个数字
  3. M1 pro芯片Macbook Pro连接服务器
  4. CleanMyMac软件最新的版本下载安装详细教程
  5. D NHK协会的阴谋
  6. WPS 或者 word 插入通栏图片
  7. 《一个程序员的奋斗史》学习笔记
  8. RNA-seq助力发现治疗多种肿瘤的潜在靶点
  9. 谷歌眼镜开发Mirror API之PHP开发
  10. 关于微信公众平台服务器配置Token