2012-07-25 21 views
5

Tenemos un sistema que tendrá decenas de miles de unidades. Cada unidad tendrá 5-10 metros y cada metro tendrá un valor asociado. Los valores de estos medidores cambian y necesitamos que nuestro motor de reglas sea capaz de responder a estos cambios en tiempo real.¿Debo usar múltiples bases de conocimiento?

Tendremos reglas del tipo "si el primer medidor de la unidad n. ° 1 es mayor que 10 y el segundo medidor de la unidad n. ° 1 es inferior a 30, entonces ...", aunque las reglas pueden ser mucho más largas que esta. Las reglas para cada unidad serán completamente independientes, por lo que no habrá reglas que condicionen los valores de dos metros diferentes de dos unidades diferentes.

Tendremos unas 30 reglas que son iguales para cada unidad, y luego cada unidad tendrá alrededor de 5-15 reglas personalizadas. Estas reglas deberán agregarse dinámicamente mientras se ejecuta el motor de reglas. Es probable que una unidad agregue 5-10 reglas cuando se registra y luego agrega o elimina una regla, como una vez por semana a partir de ese momento.

Decidimos usar Drools para esto y estoy tratando de encontrar la mejor manera de implementarlo. Soy realmente nuevo en Drools, así que estoy un poco confundido. ¿Tendría sentido que cada unidad tenga su propia base de conocimiento? Si es así, ¿hay alguna forma de compartir las reglas que son iguales para cada unidad?

Me preocupa que no tengamos suficiente memoria para almacenar todas estas reglas, así que pensé que si tuviéramos una base de conocimiento para cada unidad, podríamos serializar todas las bases de conocimiento, ponerlas en una base de datos y recupérelos cuando los necesitemos. ¿Sería eso razonable?

La otra razón por la que pensé utilizar una base de conocimientos separada para cada unidad es porque las reglas de cada unidad son completamente independientes de las reglas de cada unidad, puede haber un impacto en el rendimiento al ponerlas todas en la misma base de conocimiento. ¿Es correcto o el algoritmo Rete es lo suficientemente inteligente como para descubrirlo?

Además, ¿se están agregando dinámicamente reglas mientras el motor funciona? ¿Se deben recompilar todas las reglas? ¿Cuánto tiempo tomará y esto es factible si el motor aún necesita responder a los cambios del medidor en tiempo real?

Gracias chicos.

Respuesta

1

¿Tendría sentido que cada unidad tenga su propia base de conocimiento? Si es así, ¿hay alguna forma de compartir las reglas que son iguales para cada unidad?

Lea a continuación en cada unidad para tener su propia base de conocimientos. Para fines de organización, puede pensar en ponerlos en paquetes separados. Para compartir reglas entre paquetes, puede crear las reglas en el área global e importarlas. Aunque esto ayudará a compartir las reglas comunes, tiene algunos defectos:

  • Cuando tenga una gran cantidad de paquetes, tendrá que importarlos manualmente la primera vez.
  • Cuando modifica la regla importada en un paquete específico, cambiará la regla global y, por lo tanto, el cambio afectará a cualquier otro paquete que tenga importada la regla. En la interfaz de usuario de guvnor no hay forma de saber de forma visible si una regla se importa o es específica para el paquete.

Me preocupa que podría no tener suficiente memoria para almacenar todas estas reglas, así que estaba pensando si tuviéramos una base de conocimientos para cada unidad, podríamos serializar todas las bases de conocimiento, los puso en una base de datos, y recuperarlos cuando los necesitamos. ¿Sería eso razonable?

Esta es una opción, pero si las reglas cambian, tendrá que recrear las bases de conocimiento.

La otra razón por la que estaba pensando en utilizar una base de conocimientos separada para cada unidad se debe a que las reglas de cada unidad son completamente independientes de las reglas de cualquier otra unidad, podría haber un impacto en el rendimiento de poner a todos en la misma base de conocimientos . ¿Es correcto o el algoritmo Rete es lo suficientemente inteligente como para descubrirlo?

El libro Drools JBoss Rules 5.0 Guía del Desarrollador por Michal Bali dice

El rendimiento del algoritmo Rete es teóricamente independiente de el número de reglas en la base de conocimientos.

Además,

Si tienes curiosidad y quieres ver algunos puntos de referencia, los puedes encontrar en el módulo Drools-ejemplos que se puede descargar desde la web sitio Drools. También hay algunos sitios web que publican regularmente puntos de referencia de varias máquinas de reglas que resuelven problemas matemáticos conocidos (por lo general, prueba de 'señoritas' y 'Vals'), por ejemplo, http://illation.com.au/ puntos de referencia /. El rendimiento de Drools es comparable a otros motores de fuente abierta o incluso comerciales.

Además, está añadiendo dinámicamente reglas mientras el motor está funcionando posible? ¿Se deben recompilar todas las reglas? ¿Cuánto tiempo tomará y esto es factible si el motor aún necesita responder a los cambios del medidor en tiempo real?

No tengo una idea concreta aquí pero estoy seguro de que las reglas deben ser recompiladas para ser utilizables. El kbase creado previamente puede seguir utilizándose cuando se vuelvan a compilar los paquetes nuevos. Ellos son independientes.