2008-10-30 24 views
61

Estoy auditando un proyecto que usa lo que se llama Rules Engine. En resumen, es una forma de externalizar la lógica empresarial desde el código de la aplicación.Motor de reglas: pros y contras

Este concepto es completamente nuevo para mí y soy bastante escéptico al respecto. Después de escuchar a la gente hablar sobre Anemic Domain Models durante los últimos años, estoy cuestionando el enfoque del motor de reglas. Para mí, parecen una excelente manera de DEBILITAR un modelo de dominio. Por ejemplo, decir que estoy haciendo una aplicación web Java interactuando con un motor de reglas. Luego decido que quiero tener una aplicación de Android basada en el mismo dominio. A menos que quiera que la aplicación de Android también interactúe con el motor de reglas, tendré que perderme la lógica de negocios que ya estaba escrita.

Como aún no tengo ninguna experiencia con ellos, solo curiosidad, me interesaron los pros y los contras de utilizar un motor de reglas. El único profesional que se me ocurre es que no necesitas reconstruir toda tu aplicación solo para cambiar algunas reglas de negocios (pero, en realidad, ¿cuántas aplicaciones realmente tienen tantos cambios?). Pero usar un motor de reglas para resolver ese tipo de problema me suena como poner una tirita sobre una herida de escopeta.

ACTUALIZACIÓN - desde que se escribió esto, el dios mismo, Martin Fowler, tiene blogged about using a Rules engine.

+0

¿Está buscando productos de terceros o va a hacer los suyos propios? –

+3

Ese es un gran artículo de Martin Fowler, ¡gracias! –

+0

tienes razón, son muy anti-OO. Vienen de un tiempo en el que OO no era común (eso lo explica en parte) pero sí, quieren trabajar con registros/objetos de valor que son "anémicos" como dices. Esto no es necesariamente algo malo, pero es lo que es. Si no te gusta, no te gustarán los motores de reglas. –

Respuesta

36

La mayoría de los motores de reglas que he visto se ven como una caja negra por el código del sistema. Si tuviera que crear un modelo de dominio, probablemente me gustaría que ciertas reglas comerciales sean intrínsecas al modelo de dominio, p. reglas de negocio que me dicen cuándo un objeto tiene valores inválidos. Esto permite que varios sistemas compartan el modelo de dominio sin duplicar la lógica comercial. Podría hacer que cada sistema use el mismo servicio de reglas para validar mi modelo de dominio, pero esto parece debilitar mi modelo de dominio (como se señaló en la pregunta). ¿Por qué? Porque en lugar de aplicar constantemente mis reglas comerciales en todos los sistemas en todo momento, confío en los programadores del sistema para determinar cuándo se deben aplicar las reglas comerciales (llamando al servicio de reglas). Esto puede no ser un problema si el modelo de dominio viene completamente poblado, pero puede ser problemático si se trata de una interfaz de usuario o sistema que cambia los valores en el modelo de dominio a lo largo de su vida útil.

Existe otra clase de reglas comerciales: la toma de decisiones. Por ejemplo, una compañía de seguros puede necesitar clasificar el riesgo de suscribir a un solicitante y llegar a una prima. Puede colocar estos tipos de reglas comerciales en su modelo de dominio, pero una decisión centralizada para escenarios como este suele ser deseable y, en realidad, se ajusta bastante bien a una arquitectura orientada a servicios. Esto plantea la pregunta de por qué un motor de reglas y no un código de sistema. El lugar donde un motor de reglas puede ser una mejor opción es cuando las reglas comerciales responsables de la decisión cambian con el tiempo (como algunas otras respuestas han señalado).

Los motores de reglas generalmente le permiten cambiar reglas sin reiniciar su sistema o implementar nuevos códigos ejecutables (independientemente de las promesas que reciba de un proveedor, asegúrese de probar los cambios en un entorno que no sea de producción porque, incluso si el motor de la regla es perfecto, los humanos todavía están cambiando las reglas). Si está pensando: "Puedo hacerlo utilizando una base de datos para almacenar valores que cambian", tiene razón. Un motor de reglas no es una caja mágica que hace algo nuevo. Está destinado a ser una herramienta que proporciona un mayor nivel de abstracción para que pueda centrarse menos en la reinvención de la rueda. Muchos proveedores dan un paso más al permitirle crear plantillas para que los usuarios comerciales puedan completar los espacios en blanco en lugar de aprender un lenguaje de reglas.

Una partición precaución sobre las plantillas: las plantillas nunca pueden tomar menos tiempo que escribir una regla sin una plantilla porque la plantilla debe, como mínimo, describir la regla. Planee un costo inicial más alto (lo mismo que si construyera un sistema que utilizara una base de datos para almacenar valores que cambian en lugar de escribir las reglas directamente en el código del sistema) - el retorno de la inversión se debe a que ahorra mantenimiento futuro del código del sistema .

+1

Llego a esta discusión 2 años tarde, así que si todavía está cerca de Aaron, puede describir cómo se benefician los anteriores (sin tener que reiniciar) el sistema para los cambios, la abstracción, el desacoplamiento y la reutilización de las reglas comerciales) son distintos de los motores de reglas y no simplemente un beneficio de las arquitecturas SOA en general. En otras palabras, ¿no son los motores de reglas un subconjunto de SOA y, en caso afirmativo, cuáles son sus beneficios distintivos, frente a la simple implementación de un servicio SOA escrito en un código de estilo imperativo? –

+1

Una arquitectura SOA es un buen ecosistema para un motor de reglas para la toma de decisiones.El motor puede enrutar llamadas a diferentes servicios según las necesidades del sistema. Sin una, un administrador configuraría manualmente el sistema para seguir otra ruta. – neontapir

+1

Muchos de los beneficios que enumeré vienen con una arquitectura SOA. Un par de beneficios ofrecidos por motores de reglas que no necesariamente provienen de la arquitectura SOA son códigos declarativos y una forma para que los propietarios de negocios cambien las reglas, p. disminuir una cantidad en dólares que desencadena una revisión manual. No es que estos no se puedan lograr con soluciones de motores que no sean reglas, sino más que los motores de reglas intentan ofrecer estas características de fábrica. – Aaron

18

El mayor profesional que he visto para los motores de reglas es que permite a los propietarios de reglas de negocio implementar las reglas de negocio, en lugar de poner la responsabilidad en los programadores. Incluso si tiene un proceso ágil en el que constantemente obtiene retroalimentación de las partes interesadas y pasa por iteraciones rápidas, todavía no se logrará el nivel de eficiencia que se puede lograr haciendo que las personas que elaboran las reglas de negocio también las implementen.

Además, no puede subestimar el valor al eliminar el ciclo recompile-retest-redeploy que puede resultar de un simple cambio de regla, si las reglas están incorporadas en el código. A menudo hay varios equipos que participan en la creación de una bendición, y el uso de un motor de reglas puede hacer que gran parte de eso sea innecesario.

+0

Esto requiere problemas. Permitir que los propietarios de reglas escriban reglas de producción en un sistema reactivo (con una semántica poco clara y un comportamiento no determinista), sin pruebas y coordinación con el resto del equipo, es una mala idea. Es mejor hablar tranquilamente con devops sobre cómo agregar un método o función cuando corresponda. Si es necesario, brinde a los propietarios de reglas biz un lenguaje genérico o un dominio específico de dominio que evite los tiros de combate (estos son bastante fáciles de desarrollar actualmente) para codificar. Luego pueden conectar esto al sistema general, después de que lo hayan probado. ¡Una regla de negocio generalmente NO es una regla de producción! –

+0

"recompile-retest-redeploy cycle" está ahí por un motivo, y debe estar completamente automatizado, por lo que solo tiene que hacer clic en un botón y funciona. – IlliakaillI

23

Los motores de regla pueden ofrecer un gran valor, en ciertos casos.

En primer lugar, muchos motores de reglas funcionan de una manera más declarativa. Un ejemplo muy crudo sería AWK, donde puede asignar expresiones regulares a bloques de código. Cuando el escáner de archivos ve la expresión regular, se ejecuta el bloque de código.

Puede ver que en este caso, si tenía, por ejemplo, un gran archivo AWK y quería agregar Otra "regla", puede ir al final del archivo, agregarle expresiones regex y lógica, y termine con esto. Específicamente, para muchas aplicaciones, no está particularmente interesado en lo que hacen las otras reglas, y las reglas realmente no interoperan entre sí.

Por lo tanto, el archivo AWK se parece más a una "sopa de reglas". Esta naturaleza de "sopa de reglas" permite a las personas enfocarse muy estrechamente en sus dominios con poca preocupación por todas las otras reglas que pueden estar en el sistema.

Por ejemplo, Frank está interesado en pedidos con un total de más de $ 1000, por lo que ingresa al sistema de reglas que le interesa. "SI order.total> 1000 THEN correo electrónico Frank".

Mientras tanto, Sally quiere todas las órdenes de la costa oeste: "SI order.source == 'WEST_COAST' ENTONCES envíe un correo electrónico a Sally".

Por lo tanto, puede ver en este caso trivial y artificial que una orden puede cumplir ambas reglas, pero ambas reglas son independientes entre sí. Un pedido de $ 1200 de la costa oeste notifica a Frank y a Sally. Cuando Frank ya no esté preocupado, simplemente sacará su regla de la sopa.

Para muchas situaciones, esta flexibilidad puede ser muy poderosa. También puede, como este caso, exponerse a los usuarios finales por reglas simples. Usando expresiones de alto nivel y tal vez scripting liviano.

Ahora, claramente, en un sistema complicado hay todo tipo de interrelaciones que pueden suceder, y esta es la razón por la cual todo el sistema no está "Hecho con reglas". Alguien, en alguna parte, estará a cargo de que las reglas no se salgan de control. Pero eso no necesariamente disminuye el valor que un sistema así puede proporcionar.

Esto ni siquiera entra en cosas como sistemas expertos, donde las reglas activan los datos que las reglas pueden crear, pero un sistema de reglas más simple.

De todos modos, espero que este ejemplo muestre cómo un sistema de reglas puede ayudar a aumentar una aplicación más grande.

8

(como todo lo demás) depende de su aplicación. Para algunas aplicaciones (generalmente las que nunca cambian o las reglas son mejores en las constantes de la vida real, es decir, no cambiarán notablemente en eones, por ejemplo, propiedades físicas y fórmulas) no tiene sentido utilizar un motor de reglas, simplemente introduce complejidad adicional y requiere que el desarrollador tenga un conjunto de habilidades más grande.

Para otras aplicaciones, es realmente una buena idea. Tomemos por ejemplo el procesamiento de órdenes (las órdenes son desde la facturación hasta el procesamiento de las transacciones monetarias), de vez en cuando hay un cambio de un minuto a alguna ley o código relevante (en el sentido judicial) que requiere cumplir con un nuevo requisito (por ejemplo, impuesto a las ventas , un clásico). En lugar de tratar de forzar su aplicación anterior a esta nueva situación donde de repente tiene que pensar en el impuesto a las ventas, cuando antes no lo hacía, es más fácil adaptar su conjunto de reglas en lugar de tener que inmiscuirse potencialmente en un gran conjunto de tu código.

Luego, la próxima modificación de su gobierno local requiere la presentación de informes de todas las ventas dentro de ciertos criterios, en lugar de tener que ingresar y agregar eso también. Al final terminarás con un código muy complejo que resultará bastante difícil de manejar cuando cambies y quieras revertir el efecto de una de las reglas, sin influenciar a todos los demás ...

5

Todo el mundo hasta ahora ha He sido muy positivo acerca de los motores de reglas, pero aconsejo al lector que sea cauteloso. Cuando un problema se vuelve un poco más complicado, de repente puede descubrir que un motor de reglas completo se ha vuelto inadecuado, o mucho más complicado que en un lenguaje más potente. Además, para muchos problemas, los motores de reglas no podrán detectar fácilmente las propiedades que reducen en gran medida el tiempo de ejecución y la huella de memoria al evaluar la condición. Hay relativamente pocas situaciones en las que preferiría un motor de reglas a un marco de inyección de dependencias o un lenguaje de programación más dinámico.

3

"pero en realidad, ¿cuántas aplicaciones realmente tienen tantos cambios?"

Honestamente, cada aplicación en la que he trabajado ha pasado por un serio flujo de trabajo y/o cambios lógicos desde el concepto hasta bien después de la implementación. Es la razón número uno para la programación de "mantenimiento" ...

La realidad es que no se puede pensar en todo por adelantado, de ahí el motivo de los procesos Agile. Además, los BA siempre parecen perder algo vital hasta que se encuentra en las pruebas.

Los motores de reglas le obligan a separar verdaderamente la lógica empresarial de la presentación y el almacenamiento. Además, si utiliza el motor correcto, sus BA pueden agregar y eliminar lógica según sea necesario. Como dijo Chris Marasti-Georg, pone la responsabilidad del BA. Pero más que eso, le permite al BA obtener exactamente lo que están pidiendo.

+0

, por lo que espera que BA sepa aprender scripts en Drools? – Jasper

+0

@Jasper: No llamé específicamente Drools. Hay otros productos Uno que utilicé en otra ubicación se llamó Haley Rules Engine (ya que Oracle lo compró y lo sacó del mercado). Ese motor en particular tenía una interfaz para escribir las reglas en las que nuestros BA estaban entrenados. Fue muy resbaladizo y RÁPIDO. Debido a su facilidad de uso y velocidad, lo utilizamos para impulsar los requisitos de entrada de datos en las páginas web por cliente. Los requisitos fueron ingresados ​​por los BA directamente. Una regla de ejemplo era "Si la APR es mayor a 3.0 entonces requiera el apéndice ABC123" – NotMe

12

He escrito un motor de reglas para un cliente. El mayor logro fue incluir a todas las partes interesadas. El motor podría ejecutar (o reproducir) una consulta y explicar lo que estaba sucediendo en el texto. Los empresarios pueden ver la descripción del texto y señalar rápidamente los matices en las reglas, excepciones y otros casos especiales. Una vez que el lado del negocio estuvo involucrado, la validación se mejoró mucho porque era fácil obtener su opinión. Además, el motor de reglas puede vivir por separado de otras partes de una base de código de aplicación para que pueda usarlo en todas las aplicaciones.

La desventaja es que a algunos programadores no les gusta aprender demasiado. Los motores de reglas y las reglas que les pones, junto con las cosas que los implementan, pueden ser un poco peludos. Aunque un buen sistema puede manejar fácilmente redes de lógica enfermas y retorcidas (o ilógicas a menudo;), no es tan simple como codificar un montón de sentencias if (sin importar lo que hagan algunos de los motores de reglas simples). El motor de reglas le brinda las herramientas para manejar las relaciones entre reglas, pero aún debe ser capaz de imaginar todo eso en su mente. A veces es como vivir en la película Brasil. :)

2

Un motor de reglas es una victoria en una aplicación configurable donde no desea tener que hacer compilaciones personalizadas si puede evitarse.También son buenos para centralizar grandes bases de reglas y los algoritmos como Rete son eficientes para hacer coincidir rápidamente con grandes conjuntos de reglas.

24

Creo que sus preocupaciones sobre los modelos de dominio anémicos son válidas.

He visto dos aplicaciones de un conocido motor comercial de reglas Rete que se ejecuta en producción donde trabajo. Consideraría uno un éxito y el otro un fracaso.

La aplicación exitosa es una aplicación de árbol de decisión, que consta de ~ 10 árboles de ~ 30 puntos de ramificación cada uno. El motor de reglas tiene una interfaz de usuario que permite a las personas de negocios mantener las reglas.

La aplicación menos exitosa tiene ~ 3000 reglas atacadas en una base de datos de reglas. Nadie tiene idea de si hay reglas contradictorias cuando se agrega una nueva. Hay poca comprensión del algoritmo Rete, y la experiencia con el producto ha salido de la empresa, por lo que se ha convertido en una caja negra que es intocable e irreparable. El ciclo de implementación aún se ve afectado por los cambios en las reglas; se debe realizar una prueba de regresión completa cuando se cambian las reglas. La memoria también era un problema.

Me gustaría pisar ligeramente. Cuando un conjunto de reglas es de tamaño modesto, es fácil entender los cambios, como la muestra simplista de correo electrónico que se indicó anteriormente. Una vez que la cantidad de reglas asciende a cientos, creo que es posible que tenga un problema.

También me preocuparía que un motor de reglas se convierta en un cuello de botella único en su aplicación.

No veo nada de malo con el uso de objetos como una forma de partición de ese espacio de motor de reglas. Incrustar el comportamiento en objetos que difieren en un motor de reglas privadas me parece bien. Los problemas lo golpearán cuando el motor de reglas requiera un estado que no sea parte de su objeto para disparar correctamente. Pero ese es solo otro ejemplo de que el diseño es difícil.

2

Un montón de buenas respuestas, pero ya quería añadir un par de cosas:

  1. en la automatización de una decisión de cualquier complejidad lo fundamental se convierte rápidamente en su capacidad para gestionar en lugar de ejecutar la lógica utilizada. Un motor de reglas no ayudará con esto: debe pensar en las capacidades de administración de reglas que tiene un sistema de administración de reglas de negocios. La mayoría de los motores de reglas comerciales y de código abierto se han convertido en sistemas de administración de reglas con repositorios, informes sobre uso de reglas, control de versiones, etc. Un repositorio de reglas, estructurado en conjuntos de reglas coherentes que pueden orquestarse para tomar decisiones comerciales es mucho más fácil de administrar que cualquiera miles de líneas de código o una sopa de reglas.
  2. Hay muchas maneras de utilizar un enfoque declarativo basado en reglas. El uso de reglas para administrar una IU o como parte de la definición de un proceso puede ser muy efectivo. El uso más valioso de un enfoque de reglas, sin embargo, es automatizar las decisiones comerciales y entregar esto como servicios de decisión poco compactos que toman entrada, ejecutan reglas y devuelven una respuesta, una decisión. Estos servicios responden a preguntas de otros servicios como "¿este cliente es un buen riesgo de crédito" o "qué descuento le debo dar a este cliente por este pedido?" O "cuál es el mejor venta cruzada para este cliente en este momento". Estos servicios de decisión se pueden construir de manera muy efectiva utilizando un sistema de administración de reglas y permiten una integración sencilla de análisis con el tiempo, algo de lo que muchas decisiones se benefician.
1

Veo que los motores de reglas, procesos y datos (bases de datos a.k.a.) son esencialmente similares. Pero, por alguna razón, nunca decimos que el blackboxing del subsistema de persistencia es malo.

En segundo lugar, desde mi Punto de vista, un modelo de anemia no es uno que es ligero de aplicación de comportamientos, es uno que es ligero de comportamientos en sí. El método real que describe un comportamiento disponible en un objeto de modelo de dominio no tiene que ser hecho por el objeto mismo.

0

La mayor complejidad de mi experiencia en motores regla es que:

  1. de programación orientada a objetos Punto de vista que es un verdadero dolor de refactorizar y reglas de prueba escrito en un lenguaje declarativo, mientras se reestructuran código que les afecta.
  2. A menudo siempre debemos pensar en el orden de ejecución de las reglas que se convierte en un desastre cuando hay muchas de ellas.
  3. Algunos cambios menores pueden desencadenar un comportamiento incorrecto de las reglas que conducen a errores de producción. En la práctica, no siempre es posible cubrir todos los casos con pruebas iniciales.
  4. Las reglas que mutan los objetos utilizados en otras también aumentan la complejidad, lo que hace que los desarrolladores las dividan en etapas.