Выполнение Kiebase (экземпляр, извлеченный из кэша) требует больше времени для запуска всех правил по сравнению с тем, когда экземпляр KieBase извлекается из памяти - PullRequest
0 голосов
/ 13 февраля 2020

При создании базы знаний KieBase мы впервые храним ее экземпляр в кэше, чтобы сэкономить время сборки, используя этот кэшированный экземпляр. Я заметил, что при прямом использовании этого экземпляра х нет. раз для запуска всех правил требуется очень очень мало времени, НО, когда мы используем кэшированный экземпляр, тогда запуск всех правил занимает больше времени.

Вот время, которое kieSession.fireAllRules() берет при взятии экземпляра KieBase из памяти (т. е. KieBase экземпляр используется напрямую)

min: 0 ms, max: 184 ms, avg: 7 ms  
Individual execution time: [184, 2, 15, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 2, 5, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1]

Вот время, которое kieSession.fireAllRules() берет, когда KieBase экземпляр берется из кэша (Redis) при каждом выполнении

min: 35 ms, max: 152 ms, avg: 51 ms  
Individual execution time:  [152, 42, 45, 51, 40, 79, 56, 42, 48, 42, 44, 44, 69, 38, 40, 39, 57, 40, 61, 53, 35, 41, 43, 45, 51, 43, 48, 41, 43, 60]

//NOTE: This does not include cache fetch time. It only reflects the time taken (in ms) by function `fireAllRules` of class `KieSession`.

В приведенном выше примере я взял очень меньше нет. правил, но на самом деле у меня есть тысячи правил.

Если вы заметили, больше времени требуется, когда KieBase используется экземпляр, полученный из Cache.

Что может быть причиной такого поведения? Как сделать так, чтобы экземпляр KieBase, полученный из кэша, занимал меньше времени для запуска всех правил?

KieSession kieSession = kbase.newKieSession();
kieSession.insert(...);
kieSession.fireAllRules();
kieSession.dispose();

1 Ответ

0 голосов
/ 12 марта 2020

К сожалению, сериализация KieBase не поддерживается. Помимо производительности, вы можете столкнуться с неожиданными проблемами, поэтому, пожалуйста, воздержитесь от этого (поэтому я не знаю, почему это медленно). Вы можете хранить KieBase в памяти. Если в кластере несколько узлов, соберите KieBase для JVM и сохраните его в памяти для JVM.

...