后端|青训营笔记

70 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第3天 一、本节课,我们学习了规则引擎设计与实现 二、在本节课中, 1.我们理解规则引擎的组成部分及应用场景 2.我们理解了规则引擎的核心原理——编译原理的相关概念 3.我们设计并实现了一个规则引擎——YongEngine 4.我们实现了一个Web版的规则引擎 规则引擎 规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语音模块编写业务决策,接受数据输入。解释业务规则,并根据业务规则做出业务决策。 规则引擎可以解决开发人员重复编码的问题。 规则引擎的应用场景 风控对抗 与黑灰产的对抗过程中,策略研发和产品需要能够根据黑灰产特征进行快速识别和对抗。规则引擎作为风控系统的核心,使产研人员能够不断的调整和优化对抗策略,以实现最好的风控识别效果。 活动策略运营 业务活动的运营需要及时根据用户效果反馈进行运营策略的优化和调整。引入规则引擎后,可以将服务代码业务运营逻辑解耩,提高运营策略的迭代效率。方便新玩法的探索和效果。 数据分析和清洗 数据分析在数据分析系统中使用规则引擎可以便捷的实现对数据进行整理、清洗和转换。数据分析师可以根据不同的需求来自定义数据处理的规则,方便快捷的产出所需要的数据。 三、本节课的规则引擎实现记录 func eval(expr ast.Expr, data map[string]interface{}) interface{} { switch expr := expr.(type) { case *ast.BasicLit: // 匹配到数据 return getlitValue(expr) case *ast.BinaryExpr: // 匹配到子树 // 后序遍历 x := eval(expr.X, data) // 左子树结果 y := eval(expr.Y, data) // 右子树结果 if x == nil || y == nil { return errors.New(fmt.Sprintf("%+v, %+v is nil", x, y)) } op := expr.Op // 运算符

  // 按照不同类型执行运算
  switch x.(type) {
  case int64:
     return calculateForInt(x, y, op)
  case bool:
     return calculateForBool(x, y, op)
  case string:
     return calculateForString(x, y, op)
  case error:
     return errors.New(fmt.Sprintf("%+v %+v %+v eval failed", x, op, y))
  default:
     return errors.New(fmt.Sprintf("%+v op is not support", op))
  }

case *ast.CallExpr: // 匹配到函数 return calculateForFunc(expr.Fun.(*ast.Ident).Name, expr.Args, data) case *ast.ParenExpr: // 匹配到括号 return eval(expr.X, data) case *ast.Ident: // 匹配到变量 return data[expr.Name] default: return errors.New(fmt.Sprintf("%x type is not support", expr)) } }