0.代码地址

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

1.产生背景

想到“通过什么->得到什么”类问题,第一个想到的恐怕就是活动类项目的开发,用户通过一系列行为,得到一系列的东西。但往往这类活动变动性较大,持续性较短,因为活动玩法的不断扩充与产品运营的脑洞不断扩大,刚开始写的一系列通用的规则往往付之一炬,久而久之,就只剩下一些相对独立的抽象出来的基本模块,然后再通过摞代码方式将模块组装起来。

由于一个新活动往往与老玩法有关又无关的特性,新的活动也必须在开发,测试等环节上耗费较大精力,所出问题也比较多,以至于慢慢的,大家基本都认为,做活动类项目,直接摞代码就行,考虑复用性只会增加开发成本,且下个活动能够全部复用上的概率不大。为了找到一个简单,易用的通用营销引擎,曾调研过一系列的规则引擎等(如Activiti,Drools,Flowable),但大多上手较难(ice可能也不简单)。

本人也是深受活动类项目迫害,以至于觉得做活动完全就是一个磨性子的工作。

有迫害就有反抗,于是,ice历经三年多在几经周折与不断变更的情况下诞生了,ice项目核心框架目前已经基本开发完毕,也在实际场景中发挥了举足轻重的作用。

ice只是提供了一种此类问题的解决方案,并不敢说最优,只能说你可能会有所借鉴。

2.ice简介

eg:某商场想举办一个女神节活动,规定
1.活动期间女生用户/拥有商场会员卡的用户可参加活动
2.女性并且拥有商场会员卡的用户,可享受满100元返现50元/满50元返现20元的活动
3.能够参加活动的用户每人赠送1支鲜花
4.商场常年活动:不论是否能参加活动,消费满10000元赠送1个珍藏版商场吉祥物

现在你有:
1个只会通过身份证校验是否是女性用户的员工A
1个只会校验是否有商场会员卡的员工B(但是要报手机号等操作,校验工作比较慢)
3个只会校验消费金额的员工(一个校验100元C 一个校验50元D 一个校验10000元E)
1个只会送钱的员工F(需要被告知送多少 传递告知-上下文)
1个只会送花的员工G(需要被告知送多少 提前告知-配置)
1个只会送吉祥物的员工H(需要被告知送多少 提前告知-配置)
和若干能够了解活动规则,但除了指导用户怎么走,什么都不会的匿名员工

如果是你,要怎么安排?

其实上述所述的员工,就是对一个活动的拆解,做到单一目的的员工,如果下次出现了新活动,需要送吉祥物,直接复用那个会送吉祥物的员工即可,功能足够单一,但是要怎么拼接起来,保证活动的顺利进行呢?

先解释一下上图:

1.所有的校验员工,校验符合则返回TRUE,不符合返回FALSE
2.所有的叶子节点都是会点东西的员工,这里叫叶子节点
3.所有的拥有子节点的员工,这里叫关系节点

关系节点的解释:

1、And 所有子节点中,有一个返回FALSE 该节点也将是FALSE,全部是TRUE才是TRUE,在执行到FALSE的地方终止执行,类似于Java的&&
2、Any 所有子节点中,有一个返回TRUE 该节点也将是TRUE,全部FALSE则FALSE,在执行到true的地方终止执行,类似于Java的||
3、All 所有子节点都会执行,有任意一个返回TRUE该节点也是TRUE,没有TRUE有一个节点是FALSE则FALSE,没有TRUE也没有FALSE则返回NONE,所有子节点执行完毕终止
4、None 所有子节点都会执行,无论子节点返回什么,自己都返回NONE,任何没有子节点的关系节点将自动返回NONE
5、True 所有子节点都会执行,无论子节点返回什么,自己都返回TRUE,任何没有子节点的关系节点将自动返回NONE

写到这里才发现写的有点复杂,例子不是很好,尴尬,哈哈哈…

图中实际上还有些操作可以简化一些,比如8号节点发放的吉祥物奖励,其实可以把7号节点做成一个前置节点,也就是7号必须通过才会执行8号,这样就不再需要3号节点的存在,简化树结构方便阅读和理解。
变化后:

黄色框中的代表前置节点,只有前置节点通过(非FALSE)才可以执行

3.ice能带来什么

1.业务拆解颗粒度可控

如果你现在有一个会校验10000元并且会发吉祥物的员工,那么3-7-8节点可以完全替换成这一个员工,但是显而易见的,这样的员工,下次复用的概率,也不会高,如果下次真的要复用,直接把已经形成大颗粒度的3-7-8号节点拿出去,就可以满足。

2.可扩展性/更改更容易

如果此时,突然被告知,女神节活动只有女生能参加,不再需要和商场会员卡挂钩的那一块内容,那直接和11号节点脱钩即可。
如果此时突然宣布,能够参加的女生必须是国内用户,只需要在4号节点前增加一个判断是否是国内用户的节点即可,其他节点照旧,不受任何影响。

3.配置化更新

可以通过数据库等,实现配置化更新

4.异常出现与恢复

如果此时7号节点突然异常,E员工突发身体不适,那么可以把整棵树和影响用户的信息存储起来,等到E恢复/更换员工后,在将异常数据从7号节点继续执行后续。若此时商场临时决定,给受影响用户补发优惠券作为补偿,也为特别处理提供了可能

备注
ice项目的设计思路已经介绍完毕,目前ice项目已经用于正式的生产并扛过了活动类项目严酷的考验,也在不断探讨着其他应用场景,后续会持续优化,更新相关设计及实现细节。

有更好方案/简易的小伙伴欢迎交流~~

e:995517265@qq.com

流程/规则引擎-ice介绍相关推荐

  1. 流程/规则引擎-ice举例

    由于之前讲的有点乱,例子举的也不是特别好,现重新举例整理分享一下 0.代码地址 https://github.com/zjn-zjn/ice 1.举例 充值送礼 (10.1-10.7) 100元 送5 ...

  2. 开源规则引擎——ice:致力于解决灵活繁复的硬编码问题

    背景介绍 业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上? 是否各种调研规则引擎,发现不是太重就是接入或维护太 ...

  3. QLExpress 规则引擎使用介绍

    QLExpress 规则引擎使用介绍 一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用.让业务规则定义简便而不失灵活.让业务人员就可以定义业务规则.支持标准的JAVA语法,还 ...

  4. 规则引擎的介绍与Drools的流程分析

    规则引擎(RuleEngine)是一个有限状态机,通过入参实现状态转移,在Java中定义为JSR94规范.规则引擎目前的开源实现主要是JBoss家族的Drools,采用友好的Apache协议(意味着可 ...

  5. 流程/规则框架-ice设计

    0.代码地址 https://github.com/zjn-zjn/ice 1.节点结构 前面的ice介绍中提到用节点将业务拆解,并使用关系节点将业务连接起来并控制业务流转. 结构解释: 1.Base ...

  6. 规则引擎和流程引擎我该怎么理解

    流程引擎 什么是流程引擎 流程引擎就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程 ...

  7. springboot之ice规则引擎探索

    突然发现一个非常棒的框架,迫不及待的想要和大家分享一下 规则引擎 什么是规则引擎 规则引擎是一种工具,它使得这种计算模型编程变得更容易.它可能是一个完整的开发环境,或者一个可以在传统平台上工作的框架. ...

  8. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

  9. 小明历险记:规则引擎drools教程一

    小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看. 小明的烦恼 活动规则是根据用户购买订单的金 ...

最新文章

  1. [HNOI2015]落忆枫音
  2. poj 1185(状压dp)
  3. 判断iis是否已经安装
  4. SQL Server CheckPoint的几个误区
  5. 实用ExtJS教程100例-006:ExtJS中Window的用法示例
  6. 让Visual Studio 2013为你自动生成XML反序列化的类
  7. WPF应用程序内存泄漏的一些原因
  8. 信息学奥赛C++语言:由大到小输出1~100的整数
  9. POST提交数据之---Content-Type的理解;
  10. 449.序列化和反序列化二叉搜索树
  11. 三层交换机配置的步骤
  12. click与onclick的区别
  13. Windows10创建系统还原点
  14. 微信小程序的一些基本知识,微信小程序开发
  15. 学而优则仕:中国古代政治原生态(转自 百度 读书吧)
  16. Linux Apache FTP-Server架设
  17. java中一个简单的涂鸦程序
  18. 2.会计基础--(复式记账、会计凭证与账簿)
  19. 三国志战略版狼盟和鸿蒙,三国志战略版俘虏有什么用?俘虏作用介绍[多图]
  20. 5G模块RM500U-CN在ubuntu20.04上的驱动安装

热门文章

  1. 2015年第六届蓝桥杯省赛Java B组真题+个人题解
  2. 联想服务器系统改成win7,联想电脑怎么把Win10系统改为win7系统?
  3. 输入年份,然后打印出该年的万年历,以及标识出当天日期。类似于linux下的cal -y结果。
  4. 【译】IPSEC.CONF(5) - IPsec配置
  5. 计算机不间断电源维修,ups电源工作原理和维修技巧,具体故障现象的分析处理!...
  6. macbook充电_如何判断MacBook是否正在充电
  7. “《正在爆发的互联网革命》——30余位互联网大腕一致推荐,3.5亿网民必看!”
  8. 你给我的感悟,我读懂了文字
  9. Elias Kiritsis《String Theory in a Nutshell》(埃利亚斯·基里西斯《简明弦论》)中文目录
  10. VMware报错 无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件