我即将潜入一个面向规则的项目(使用ILOGs .NET规则 - 现在是IBM)。我已经阅读了几个关于如何设置规则处理以及如何与规则引擎交互的不同观点。
我看到的两个主要想法是将规则引擎集中到其自己的服务器场中,并通过Web服务API(或通过WCF在ILOG的情况下)对服务器场进行编程。另一方面是在每个应用服务器上运行规则引擎的实例,并在本地与其进行交互,每个实例都有自己的规则副本。
集中化的优势在于易于将规则部署到集中位置。规则按需要扩展,而不是每次扩展应用程序服务器配置时进行扩展。这减少了购买许可证的浪费。这种设置的缺点是增加了服务调用,网络延迟等的开销。
本地运行规则引擎的上行/下行与集中配置的上行/下行完全相反。没有慢速服务调用(快速API调用),没有网络问题,每个应用服务器都依赖于它自己。管理规则的部署变得更加复杂。每次向应用云添加节点时,您都需要更多的规则引擎许可证。
在阅读白皮书时,我发现亚马逊正在为每个应用服务器配置运行规则引擎。他们似乎对规则进行了缓慢的部署,并认识到规则发布中的滞后是“可接受的”,即使业务逻辑在给定的时间段内不同步。
问题:根据您的经验,开始将规则集成到基于.net的网络应用程序中的最佳方式是什么?这个网站尚未花费太多时间在规则驱动的世界中工作?< / p>
答案 0 :(得分:3)
我从不喜欢集中化论点。这意味着所有内容都耦合到规则引擎中,后者成为系统中所有规则的倾倒场。很快你就不会因为害怕未知而改变任何东西:“我们会破坏什么?”
我更喜欢将亚马逊的服务理念视为孤立的自主组件。我将其解释为服务拥有其数据及其规则。
这具有划分规则空间的额外好处。随着规则集的增长,规则集变得越来越难以维护;更好地将它们保持在可管理的大小。
如果规则集的某些部分是共享的,我更喜欢数据驱动的DI方法,其中服务可以拥有自己的规则引擎实例,并在启动时从数据库加载通用规则。如果您的iLog许可证使多个实例成本过高,则这可能不可行。那将是一个应该帮助的产品可能实际上决定将带来悲伤的建筑选择的情况。对于较便宜的替代方案(例如,Java-land中的JBoss Rules),这将是一个很好的论据。
数据驱动的决策树方法怎么样? Rete规则引擎是否真的有必要,o是推动您选择的“企业工具”决策吗?
我尝试设置规则引擎,以便尽可能地与企业的其他部分分离。如果可以的话,我不会呼吁数据库或服务。更好地使对象的责任要求做出决定。让他们调用必要的Web服务和数据库来组合必要的数据,将其传递给规则引擎,并让它做它的事情。耦合是你的敌人:尝试设计你的系统以最小化它。保持规则引擎隔离是一种很好的方法。
答案 1 :(得分:2)
我对“哪个服务器”问题没什么好说的,但我会敦促你们开发决策服务 - 使用规则做出决策但不改变业务状态的可调用服务。让调用应用程序/服务/进程决定由于调用决策服务而使调用组件实际启动决策服务建议的操作而进行的数据更改,这使得更容易一遍又一遍地使用决策服务再次(跨渠道,流程等)。更清洁,与基础设施的其他部分联系更少,决策服务将更加可重用和可管理。 在这方面,讨论here on ebizQ可能值得一读。
答案 2 :(得分:2)
我们正在使用ILOG For DotNet ,并已部署了试点项目。
以下是我们不成熟的规则架构的摘要:
ILOG.Rules.dll
和新增的RuleEngines。合并RuleEngine是因为将RuleSet绑定到RuleEngine是很昂贵的。我们将RuleExecutionServer视为托管平台,并将RuleTeamServerForSharePoint视为规则源的主机。最终,我们将在代码发布流程之外部署规则到生产。
我们所有规则工作的主要障碍是建模和规则编写技能组合。
答案 3 :(得分:0)
根据我对规则引擎的经验,我们应用了一套非常基本的实践来管理与规则引擎的交互。首先,这些一直是商业规则引擎(iLog,Corticon)而不是开源(Drools),因此,由于许可成本,本地部署到每个应用服务器从未真正成为可行的选择。因此,我们总是采用集中模式,尽管有两种主要形式: