以下是我如何使用Drools来设计设计 – 每本书将有一个对学生资料作为LHS的几个领域约束的规则,书籍规则的RHS只是将书籍ID添加到全局结果列表中,然后是所有书籍规则被加载到RuleBase中.当学生搜索/浏览图书馆系统时,会从RuleBase创建无状态会话,并将学生的个人资料称为事实,然后学生可以借用的每本书将触发其书籍规则,并获得完整的图书列表学生可以借用全球成绩单.
几个假设:图书馆将处理数百万本书;我不期望书规则太复杂,每个规则最多只有3个简单的字段约束;系统需要处理的学生人数在100K左右,所以负载相当沉重.我的问题是:如果加载了一百万本书规则,Drools会记录多少内存?所有这些百万条规则将会有多快?如果Drools是合适的,我想听听有经验的用户设计这样一个系统的最佳实践.谢谢.
解决方法
通过规则引擎运行大量书籍将会变得昂贵.特别是因为您不会向用户显示所有结果:每页只有10-50个.想到的一个想法是使用规则引擎构建一组查询条件. (我实际上不会这样做 – 见下文)
这是我想到的:
rule "Only two books for networking" when Student($checkedOutBooks : checkedOutBooks),Book(subjects contains "networking",$book1 : id) from $checkedOutBooks,id != $book1) from $checkedOutBooks then criteria.add("subject is not 'networking'",PRIORITY.LOW); end rule "Books allowed for course" when $course : Course($textbooks : textbooks),Student(enrolledCourses contains $course) Book($book : id) from $textbooks,then criteria.add("book_id = " + $book,PRIORITY.HIGH); end
但我实际上不会这样做!
这是我如何改变问题:
不向用户显示书籍是一种糟糕的经历.用户可能想要仔细阅读这些书籍,看看下一次要下载哪些书籍.显示书籍,但不允许结帐受限制的书籍.这样,每个用户一次只能运行1-50本书来执行规则.这将是相当zippy.上述规则将成为:
rule "Allowed for course" activation-group "Only one rule is fired" salience 10000 when // This book is about to be displayed on the page,hence inserted into working memory $book : Book(),$course : Course(textbooks contains $book),Student(enrolledCourses contains $course),then //Do nothing,allow the book end rule "Only two books for networking" activation-group "Only one rule is fired" salience 100 when Student($checkedOutBooks : checkedOutBooks),id != $book1) from $checkedOutBooks,// This book is about to be displayed on the page,hence inserted into working memory. $book : Book(subjects contains "networking") then disallowedForCheckout.put($book,"Cannot have more than two networking books"); end
我正在使用激活组来确保只有一个规则被触发,并且显着地确保它们按照我想要的顺序触发.
最后,保持规则缓存. Drools允许 – 并建议 – 您只将规则加载到知识库中,然后从中创建会话.知识库昂贵,会话便宜.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。