Должен ли я использовать Drools в этой ситуации? - PullRequest
9 голосов
/ 16 февраля 2010

Я буду использовать библиотечную систему университета, чтобы объяснить мой вариант использования. Студенты регистрируются в библиотечной системе и предоставляют свой профиль: пол, возраст, факультет, ранее пройденные курсы, зарегистрированные в настоящее время курсы, книги, уже заимствованные и т. Д. Каждая книга в библиотечной системе будет определять некоторые правила заимствования, например, на основе профиля студентов. учебник по компьютерному алгоритму может быть заимствован только студентами, которые в настоящее время зарегистрированы в этом классе; другой учебник может быть заимствован только студентами математического факультета; могут быть и такие правила, что учащиеся могут брать не более 2 книг по компьютерным сетям. В результате правил заимствования, когда студент ищет / просматривает в библиотечной системе, он будет видеть только те книги, которые он может позаимствовать. Таким образом, требование действительно сводится к линии эффективного составления списка книг, которые студент имеет право брать.

Вот как я представляю дизайн, используя Drools - каждая книга будет иметь правило с несколькими полевыми ограничениями в профиле студента как LHS, RHS правила книги просто добавляет идентификатор книги в глобальный список результатов, а затем все правила книги загружаются в RuleBase. Когда студент ищет / просматривает библиотечную систему, из RuleBase создается сеанс без сохранения состояния, и профиль студента утверждается как факт, тогда каждая книга, которую студент может одолжить, запускает свое правило книги, и вы получаете полный список книг, которые студенты могут брать в глобальном списке результатов.

Несколько предположений: библиотека будет обрабатывать миллионы книг; Я не ожидаю, что правило книги будет слишком сложным, максимум 3 простых поля для каждого правила; количество учащихся, с которыми система должна справиться, находится в диапазоне 100 Кб, поэтому нагрузка довольно высокая. Мои вопросы: сколько памяти займет Drools, если загружено миллионами правил книги? Как быстро все эти миллионы правил сработают? Если Drools подходит, я хотел бы услышать некоторые рекомендации по проектированию такой системы от ваших опытных пользователей. Спасибо.

Ответы [ 5 ]

11 голосов
/ 17 февраля 2010

Во-первых, не устанавливайте правила для каждой книги. Установите правила для ограничений & ndash; здесь определено намного меньше ограничений, чем для книг. Это окажет огромное влияние на время работы и использование памяти.

Запуск тонны книг через механизм правил будет дорогостоящим. Тем более, что вы не будете показывать все результаты пользователю: всего 10-50 на страницу. Одна идея, которая приходит на ум, - это использовать механизм правил для построения набора критериев запроса. (Я бы на самом деле не делал этого - см. Ниже.)

Вот что я имею в виду:

rule "Only two books for networking"
when
  Student($checkedOutBooks : checkedOutBooks),
  Book(subjects contains "networking", $book1 : id) from $checkedOutBooks,
  Book(subjects contains "networking", 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 книг для выполнения правил за раз на пользователя. Это будет довольно быстро. Вышеуказанные правила стали бы:

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),
  Book(subjects contains "networking", $book1 : id) from $checkedOutBooks,
  Book(subjects contains "networking", 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 разрешает & mdash; и предлагает & mdash; вы загружаете правила только один раз в базу знаний, а затем создаете из них сеансы. Базы знаний стоят дорого, сессии дешевы.

7 голосов
/ 16 февраля 2010

Мой опыт работы с Drools (или механизмом правил в целом) заключается в том, что он хорошо подходит, если важен обзор пользователем правил, или если бы быстрое изменение правил без превращения его в проект кодирования, или еслинабор правил очень велик, что затрудняет управление, анализ и анализ кода (поэтому вам нужно, чтобы деловые люди просили технических специалистов прочитать код и рассказать им, что происходит в ситуации X).

Этокак говорится, правила двигателей могут быть узким местом.Они не запускают ничего похожего на производительность кода, поэтому вам нужно управлять этим заранее архитектурно.В этом конкретном случае, безусловно, за этим стоит база данных, и вы можете добавить к проблемам с производительностью, что база данных будет возвращать запрос намного быстрее, чем вы можете проанализировать весь набор в коде.

Я бы абсолютноне реализовав это, создав миллион объектов правил, я бы сделал тип книги, которому можно назначить несколько книг, и запускаю правила для типов книг, а затем показываю только книги разрешенного типа.Таким образом, вы можете загрузить типы, пропустить их через механизм правил, а затем отправить разрешенные типы в запрос на конце базы данных, который извлекает список книг разрешенных типов.

Типы немного усложняютсятем более вероятно, что на практике книга может быть двух типов (допускается, если вы посещаете определенный курс, или в целом, если вы являетесь частью кафедры), но такой подход все же следует придерживаться.

1 голос
/ 10 декабря 2012

Каждый раз, когда мы смотрим на большие наборы данных (о чем этот вопрос ... хорошо ли подходит Drools в случае большого набора данных), думайте нестандартно (ниже). Каждый раз, когда мы говорим о «миллионах объектов» или аналогичных проблемах типа log-N, я не думаю, что рассматриваемый инструмент - это обязательно проблема. Так что да, можно использовать Drools (или JBoss Rules), НО имело бы смысл только в определенном контексте ...

Если у вас есть log-N чего-либо (перекрестная ссылка на большие наборы данных с входными данными), я бы рекомендовал использовать более новые подходы, такие как Bloom-фильтры на основе базы данных. Они могут быть реализованы как объекты Java и на них ссылается Drools для поиска фактов (однако пользовательское кодирование там).

Поскольку фильтры Блума представляют собой крошечные структуры памяти, имеющие только базовые функции insert () / contains (), у них есть недостаток ... около 1% ложных срабатываний. Так что это будет служить первичным кешем. Если для решения вопроса Drools в качестве ответа в общем случае будет «НЕТ», поиск в таблице фактов с использованием фильтра Блума будет молниеносным и с небольшим объемом памяти (около 1,1 байта на запись в моей реализации), поэтому 1 МБ ОЗУ для этот случай. Затем в случае «содержит» (который может быть ложно-положительным), используйте для пояснения таблицу фактов на основе базы данных. Опять же, если в 80% случаев поиск будет ложным, то фильтр Блума обеспечит значительную экономию памяти и времени. В противном случае чистый поиск (что угодно - факты Drools, база данных и т. Д.) 1M записей будет очень дорогим каждый раз (по памяти и скорости).

1 голос
/ 26 августа 2010

Мои вопросы: сколько памяти будет Слюни берут, если загружен миллион книжные правила? Как быстро это будет для все эти миллион правил уволить?

Как быстро работает ваш компьютер и сколько у вас памяти? В каком-то смысле вы можете узнать это, только создав доказательство концепции и заполнив его нужным количеством (случайно сгенерированных) тестовых данных. Мой опыт показывает, что Drools быстрее, чем вы ожидаете, и что вы должны очень хорошо знать, что скрывается под капотом, чтобы иметь возможность предсказать, что сделает его медленным.

Обратите внимание, что вы говорите о миллионе фактов сеанса правил (т.е. объектах книги), а не о миллионе правил. Есть только несколько правил, которые не заставят себя долго ждать. Потенциально медленная часть - вставка миллиона объектов, потому что Drools должен решить, какие правила включить в Повестку дня для каждого нового факта.

Жаль, что ни у кого из нас нет ответа на какую-то конкретную схему с миллионами фактов.

Что касается реализации, мой подход состоял бы в том, чтобы вставить объект Book для каждой книги, которую студент хочет проверить, отозвать те, которые не разрешены, и запрос для получения оставшихся (разрешенных) объектов Book, и другой запрос, чтобы получить список причин. Либо используйте объекты RequestedBook, которые имеют дополнительные свойства boolean allowed и String reasonDisallowed, которые можно установить в своих правилах.

0 голосов
/ 17 февраля 2010

Я бы беспокоился о том, что количество правил должно зависеть от количества учеников, что может усложнить задачу (это звучит как самая большая проблема).

...