基于数据的策略服务器的Drools规则引擎

基于数据的策略服务器的Drools规则引擎,drools,dsl,Drools,Dsl,这是我的用例。我们正在尝试使用Drools实现策略服务器。可能有几十万(约200K)条规则,都是基于数据驱动的。一些示例规则: POLICY #1: Gender = Male && AGE BETWEEN 30 AND 40 && BORN_STATE IN (NC,CA,PA) ===> [Outcome = Allow] POLICY #2: (Gender = Male OR Gender = F

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

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]
注意:我在这里只使用了4个参数,但在任何给定规则中最多可以有20个参数

政策1和政策2看起来简单明了。然而,政策3是棘手的。策略3的最后一个条件
(BORN\u STATE\u supporting=TRUE)
表示策略上的状态是“包含”的,这意味着,如果规则匹配,结果将
“NotAllow”
但是,如果所有参数匹配但不
BORN\u STATE
(例如,女性,年龄=15岁,州=NY),则结果应为“允许”。对于我们的用户来说,这只是一种不列出这种情况下所有47个州的方法

其他用例很少:

  • 在用户维护规则时查找并防止重复规则
  • 正如我提到的,可能有数以千计的这些规则,所以如果有冲突(多个冲突规则相匹配),我们应该考虑高优先级规则的结果。<李>
我们的用户既不喜欢Drools Guvnor,也不认为它适合我们的需要。因此,我们的任务是构建一个自定义UI来管理规则。我计划提出一个DSL,我们的用户使用它,并通过编程生成DRL文件。我不确定这是否有效

我熟悉Drools和DRL文件。但是,我不确定Drools是否能够解决某些复杂性(例如:查找重复的规则和策略#3),以及Drools是否能够处理负载。如有任何建议、参考或指示,将不胜感激

出生州的更新:

政策3预期行为:

Input #1:   Female, Age=15, State=NC
===> [Expected Outcome = NotAllow]
Input #2:   Female, Age=25, State=NC 
===> [Expected Outcome = <age not in range, rule didn't match>] (Neither NotAllowed Nor Allowed) 
Input #3:   Female, Age=15, State=NY 
===> [Expected Outcome = Allow] (Opposite of NotAllow)
Input#1:女性,年龄=15岁,州=NC
==>[预期结果=不允许]
输入#2:女性,年龄=25岁,州=NC

==>[预期结果=您正在创建一个没有并发症的并发症:通过提供操作员
不在
中,可以消除
出生状态

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

我建议不要使用优先级

不要创建O(100000)规则。类似的案例在更少的时间内不起作用

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

更新 对于15岁的女孩有一组状态:{AL:NY,ND:WY},所以你有一个参数集({15},{AL:NY,ND:WY},…),可能还有其他的参数集,比如({16:20},{AL:WY},…)({21:99},{AL:WY},…)

如果专家们说,除了来自北卡罗来纳州的15岁女性之外,所有州(15-99岁)的女性都符合条件,那么你必须计算出设定的差异

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

作为相互不相交集的并集(其中有一个最优解,除此之外还有更多)。---我对保险单只有外行的理解,但我确信处理这些集代数运算的好策略是不言而喻的。毕竟,“不允许”不是一些随机操作的结果。

关于
出生状态
的复杂性,我会用一个例子来更好地解释。我认为这只是一个如何在DRL规则中表示的问题。也许,我可以就此提出一个单独的问题。你必须打破另一个解释。任何参考文献在哪里我能读到这个?重生之州支持:请编辑你的问题。--“其他解释”:这是基本的集合论。另外,你可以看看blog.athico.com/2013/02/design-patterns-in-production-systems.html,IIRC第2.4节,事实分类。我更新了Q,包括一些样本输入和政策的预期结果#3 w.r.t
BORN\u STATE\u supporting
。我已经阅读了PDF文档,它的第2.2节重新考虑使用“参数事实”。但是,我如何设计条件分组。例如#1
(A=a1 | | B=b1)和C=c1
例如#2
A=a1&(B=b1 | C=c1)
感谢您迄今为止的帮助。我看不出更新有任何改变。对于20个离散属性的每一个组合,结果要么是真的,要么是假的(或者,可能是策略代码或“否”).---一个技术问题是使这些集合的定义尽可能简单;另一个问题是如何以最简洁的形式表示它们,但又不会使它们的计算复杂化。
a==a1 | | B==b2
这样的条件必须在两个定义中加以考虑,并通过处理来暗示并集。