为基于数据的策略服务器Drools Rule Engine

时间:2017-04-28 21:52:15

标签: drools dsl policy

这是我的用例。我们正在尝试使用Drools实现策略服务器。可能有几十万(~200K)规则,都基于数据驱动。几个例子规则:

          int selectedId = radioGroup.getCheckedRadioButtonId();

            // find the radiobutton by returned id
            radioButton = (RadioButton) findViewById(selectedId);

            Toast.makeText(MyAndroidAppActivity.this,
                radioButton.getText(), Toast.LENGTH_SHORT).show();

注意:我这里只使用了4个参数,但任何给定规则中最多可以有20个参数

政策#1和政策#2看起来简单直接。但是,政策#3很棘手。策略#3的最后一个条件POLICY #1: Gender = Male && AGE BETWEEN 30 AND 40 && BORN_STATE IN (NC,CA,PA) ===> [Outcome = Allow] POLICY #2: (Gender = Male OR Gender = Female) && AGE = 40 && COUNTRY IN (USA,UK,BRA, IND) ===> [Outcome = Allow] POLICY #3: Gender = Female && (AGE BETWEEN 10 AND 20 || BORN_YEAR > 1990) && BORN_STATE IN (NC,CA,PA) && BORN_STATE_SUPPORTIVE = TRUE ===> [Outcome = NotAllow] 表示策略中的状态是“包含”的,这意味着,如果规则匹配,结果将(BORN_STATE_SUPPORTIVE = TRUE)但是,如果所有参数都匹配但不是{{1} }(例如女性,年龄= 15,州=纽约)然后结果应该是“允许”。对于我们的用户来说,不要为这种情况列出所有47个州。

其他几个用例很少:

  • 在规则维护用户时查找并阻止重复规则
  • 正如我所提到的,可能有数以千计的规则,所以如果存在冲突(多个冲突的规则匹配),我们应该考虑高优先级规则的结果。

我们的用户既不喜欢Drools Guvnor,也不相信它适合我们的需求。因此,我们的任务是构建一个自定义UI来管理规则。我打算想出一个用户使用的DSL并以编程方式生成DRL文件。我不确定Drools DSL feature会为此工作。

我熟悉Drools和DRL文件。但是,我不确定Drools中是否可以解决某些复杂问题(例如:查找重复规则和策略#3),如果Drools能够处理负载。任何,参考或方向将不胜感激。

"NotAllow"的更新:

Polic#3预期行为:

BORN_STATE

简而言之,如果除了BORN_STATE_SUPPORTIVE之外的所有其他条件都匹配,则结果必须与规则相反。并且,如果任何其他条件不匹配,则必须忽略该规则。

1 个答案:

答案 0 :(得分:0)

您正在创建一个没有一个复杂功能的复杂功能:通过提供运营商BORN_STATE_SUPPORTIVE可以消除NOT IN

至于测试:你有一个具有离散坐标的20维空间,这意味着点数至少为2 ^ 20。在运行时发现多个匹配或不匹配不会是一个问题,因此提供boffins为这种情况接受的解决方案可能是要走的路。如果您需要确保永远不会发生这种情况,则必须验证您的规格。

我建议不要使用优先级。

不要创建O(100000)规则。类似的案例并不适用于此。

至于验证:您拥有的逻辑基于20维空间S中的点集。您有两组,A ∪ F = SA ∩ F = Φ。每个规则定义一个子集Ai⊂A,您需要检查所有i≠j的∪Ai = AAi ∩ Aj = Φ。不是一个大问题,可以在一两天内实施(除非你在未显示的17个维度中有一些非常奇怪的东西)。

<强>更新 15岁女孩有一组州:{AL:NY,ND:WY}。所以你将有一个参数集({15},{AL:NY,ND:WY},...),可能是其他参数集,如({16:20},{AL:WY},...) ,({21:99},{AL:WY},......)。

如果boffins说来自所有州的所有(15-99)名女性除了来自北卡罗来纳州的15岁女孩之外都有资格,你将不得不计算设定差异

({15:99},{AL:WY}) - ({15},{NC})

作为相互不相交的集合的联合(有一个最优解决方案,还有更多解决方案)。 ---我只有外行人对保险单的理解,但我很确定处理这些集合代数运算的好策略将是相当明显的。毕竟,“不允许”不是随机操作的结果。