[关闭]
@yanglfyangl 2018-06-07T06:17:43.000000Z 字数 1297 阅读 523

支持引擎之 -- 规则引擎

为什么使用规则引擎

期望作用

  1. 在异步计算中心中,调用规则引擎来简化代码量;
  2. 让产品和技术能够共同的来设计业务逻辑;
  3. 让业务变更变得更容易
  4. 让不同能力的工程师,最终写出来的代码的质量可控。

示例

例如如下加趣币业务,有如下规则

  • 如果一个普通用户发了一个鲜花,加 1 趣币;
  • 如果是这个圈子里的圈主发了一个鲜花,加 1.5 趣币;
  • 如果不是这个圈子里的圈主,但是别的圈子的圈主发了一个鲜花,加 1.2 趣币;

这样的操作可以抽象成

基本操作规则

  • 获取用户角色(UserInfo)
  • 给用户加趣币(userID, conNumber)

这时候,可以写逻辑了

  1. addFunctionOfClassMethod(获取用户角色 ... )
  2. addFunctionOfClassMethod(给用户加趣币 ... )
  3. addMacro(本圈圈主)
  4. addMacro(圈主但非本圈)
  5. addMacro(普通用户)
  6. if 本圈圈主 then 给用户加趣币(usrID, 行为类型, 1.5
  7. if 圈主但非本圈 then 给用户加趣币(usrID, 行为类型, 1.2
  8. if 普通用户 then 给用户加趣币(usrID, 行为类型, 1)

这样,代码容易理解,同时Review和更新更方便。

简单分析

简单流程

Created with Raphaël 2.1.2事件事件队列队列规则引擎规则引擎规则库规则库业务服务业务服务服务服务数据库数据库推事件调用调用返回结果入库结果入库

规则库分三部分

  1. 基本操作,例如

    • "读取用户信息"
    • "增加趣豆"
    • "增加趣币"
    • "写错误日志"
    • ...
  2. "变量或判断"定义(宏定义),例如:

    • "后台管理员"
    • "本圈圈主"
    • "。。。"
  3. 业务逻辑(名称:逻辑)

    • HandleBeanCoin: 上面的逻辑
    • ...

未来

  • 支持可视化规则库。
  • 支持规则版本。

示例

API:

  1. class IRuleService:{
  2. abstrt List<T> getSpecFunctions();
  3. abstrt List<T> getSpecMaco();
  4. abstrt List<T> getRulesFiles();
  5. ...
  6. }
  7. class RuleConfig:{
  8. threadNumber;
  9. ....
  10. }
  11. class RuleClient:{
  12. open(RuleConfig)
  13. List<String> listCommonFunctions();
  14. List<String> listCommonMaco();
  15. List<String> listCurrentlyRules
  16. executeRules(String Key);
  17. }

Example:

Example Bean

  1. class ExampleBean: extend IRuleService{
  2. ...
  3. ...
  4. ...
  5. }

Example Rule files

  1. {
  2. "key":"userLoginRules"
  3. "content": "
  4. if 用户刚注册 then 充趣币(500)
  5. if 用户今天第一次登录 then 充趣币(5)
  6. ...
  7. "
  8. }

Exampel

  1. @Test
  2. void main(){
  3. RuleClient client = RuleClient.Open(config);
  4. client.executeRules("userLoginRules", "userID1");
  5. ...
  6. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注