这是我参与[第五届青训营]伴学笔记创作活动的第8天。
GO语言的规则引擎
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
随着对业务理解的不断深入和抽象,可以发现很多业务场景的功能(代码)都可以抽象成“规则+指标”的模式。这种模式,可以应用于很多场景,如:
1.风控场景,识别黑产,需要各种规则来进行判别;
2.流量(内容)分发场景,需要基于各种可收集的指标,组成规则,然后基于规则,来对用户进行定制化的内容分发;
3.推荐场景,推荐本身就是一个基于多指标的典型规则场景模式(或者说,机器学习就是一个收集数据指标,然后进行学习,最后进行推广的过程)。
4.数据清洗场景,有些业务数据需要使用规则进行打标、清洗、识别,最后落表使用。有规则,有指标了,当然还需要一个可以执行规则的引擎。
使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本,其优点如下:
- 分离商业决策者的商业决策逻辑和应用开发者的技术决策;
- 能有效的提高实现复杂逻辑的代码的可维护性;
- 在开发期间或部署后修复代码缺陷;
- 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内;
- 符合组织对敏捷或迭代开发过程的使用;
规则的执行模式
- 顺序模式:规则优先级高越高的越先执行,规则优先级低的越后执行。这也是 drools 支持的模式。此模式的缺点很明显:随着规则链越来越长,执行规则返回的速度也越来越慢。
- 并发执行模式:在此执行模式下,多个规则执行时,不考虑规则之间的优先级,规则与规则之间并发执行。规则执行的返回的速度等于所有规则中的执行时间最长的那个规则的速度(逆木桶原理)。执行性能优异,但无法满足规则优先级。
- 混合执行模式:规则引擎选择一个优先级最高规则的最先执行,剩下的规则并发执行。规则执行返回耗时= 最高优先级的那个规则执行时间 + 并发执行中执行时间最长的那个规则耗时;此模式兼顾优先级和性能,适合于有豁免规则(或前置规则)的场景。
- 逆混合执行模式:优先级最高的 n-1 个规则并发执行,执行完毕之后,再执行剩下的一个优先级最低的规则。这种模式适用于有很多前导判断规则的场景。其特性与混合模式类似,兼顾性能和优先级。
- 桶模式:名字源于《算法导论》中的桶排序。规则引擎基于规则优先级进行分桶,优先级相同的规则置于同一个桶中,桶内的规则并发执行,桶间的规则基于规则优先级顺序执行。