Domanda

Ho avuto uno sguardo a Rules Engine WF e NxBRE e sembra interessante, ma io sono sicuro di quanto bene si esibiranno in scenari di vita reale .

Quello che ho in mente è qualcosa di simile a una base di fatto con tra 10 e 100 milioni di fatti e regole come:

Object.Field <5000 e Object.Field> 1000 E IsProperty (Object.Field2)

Sto usando C # e .NET.

Modifica non ho farmi capire (totalmente colpa mia) :) Ho il mio sistema di valutazione propria regola che utilizza l'algoritmo RETE in sé ... è abbastanza veloce, si può valutare i 10 milioni infatti scenario in circa 10 secondi ... quanto velocemente sono soluzioni comercial in comaparison?

È stato utile?

Soluzione

La risposta breve è che mi aspetterei un motore di regole per sovraperformare una soluzione indispensabile una volta che il numero di regole supera alcuni (non so il valore esatto) valore di soglia.

La parte regole di un motore di regole è un insieme di condizioni e azioni. Una sola regola è (quasi) funzionalmente equivalente ad una se - dichiarazione poi. La vera potenza di un motore di regole traspare a causa della natura dichiarativa del motore.

In un programma imperativo tradizionale, si deve codificare come la logica è valutata. Quando si utilizza un motore di regole, si determina quante delle sue dichiarazioni sono valutate. Ho solo usato motori come Jess o CLIP , che utilizzano un rete algoritmo di capire quali regole al fuoco. E 'l'efficienza delle regole di cottura algoritmo che sta per guidare quanto più efficiente il vostro motore di regole si esibirà su una soluzione imperativo tradizionale.

L'algoritmo di Rete è stato progettato per sacrificare la memoria per una maggiore velocità. Mantiene una rete di nodi di mappatura modelli laterali LHS alle regole. Le più regole e fatti che hai, meglio la rete rete sorpasserà la soluzione indispensabile, perché le prestazioni Rete è teoricamente indipendente dal numero di regole nel sistema.

Pensi di fare un sacco di fatti. Se si prevede di avere un sacco di regole, si può incorrere in problemi di memoria.

Date un'occhiata a un articolo di Martin Fowler su . E 'una buona e (molto) Breve panoramica.

un discussione lunga su Microsoft Business Rules Engine (MS-BRE) adn la sua prestazione rispetto a Jess & Drools. Molti dei punti sollevati sottolineano il motivo per cui queste valutazioni sono difficili.

Altri suggerimenti

La "voce che non è un'implementazione rete fedele" si riferisce a una questione antica per uno dei crediti che il Motore regole di business incluso con BizTalk Server non riesce ad attuare correttamente l'algoritmo rete. L'affermazione non era corretta, tra l'altro. Il BRE fa certamente implementare Rete. Il motore di regole WF è una tecnologia completamente diversa alla BRE. Come dice Karl, il motore di regole WF non implementa Rete a tutti, sia correttamente o meno. Si tratta di un esempio di ciò che può essere definito senza bloccare un motore 'sequenziale'. Esso implementa una forma di concatenamento in avanti. Tuttavia, i problemi reali sono un po 'più complessa di questa. Il bit 'avanti' si riferisce al tipo di ragionamento logico che un motore può fare. Il termine non è in realtà ti dice nulla circa i meccanismi coinvolti in fase di esecuzione. Il vero problema è di quanto è buono il motore è al ragionamento. Sì, WF può inoltrare a catena, e sì, può ragionare, ma solo in maniera molto limitata. Un motore di Rete offre capacità di ragionamento più forte, ma questo è in realtà nulla a che fare con l'uso dell'algoritmo Rete, che è in realtà solo un'ottimizzazione per una certa classe di motore di regole definito un sistema di 'produzione'. È a che fare con il modo in cui un sistema di produzione può ragionare su un'intera 'di base fatto' mentre il motore sequenziale regola WF può ragionare solo direttamente sopra l'equivalente di un singolo fatto. I problemi sorgono perché a volte le persone confondono un particolare meccanismo di runtime che consente in avanti concatenamento con il processo logico di concatenamento in avanti per sé (e dopo tutto, che è piuttosto una sottile distinzione). Il meccanismo pertinente WF può certamente essere utilizzato per la ragione in modo 'avanti' in misura limitata, ma il suo uso primario è quello di permettere regole sequenziali per essere espressi in un semi-dichiarativa modo - cioè, le regole possono essere espressi in qualsiasi sequenza indipendentemente dalle dipendenze procedurali tra tali norme. Questo non ha nulla a che fare con il ragionamento in avanti o, in effetti, il processo loical di concatenamento in avanti.

La questione è un po 'complessa e oscura, e so che alcuni dei ragazzi di MS non sono d'accordo con me su questo (abbiamo discusso spesso abbastanza), ma questo è il mio prendere su di esso.

Una cosa da essere molto consapevoli è che il WF Rules Engine è che in realtà implementa il proprio parser e, di conseguenza, è un po 'limitato nella sua espressività e ha considerazioni sulle prestazioni in quanto è praticamente fa stringa parsing di interpretare le regole in codice (azioni eseguibili) in fase di esecuzione.

Abbiamo fatto 24 milioni di test attraverso 1500 norme in sette minuti utilizzando JBoss Drools con due JVM in esecuzione su abbastanza server maledettamente media. Questo è più di trenta sei miliardi di prove da eseguire se è stato eseguito ogni combinazione, e la maggior parte delle prove di avere più scelte logiche in loro. (Il vostro esempio ha tre scelte, per esempio.)

si dovrebbe anche prendere in considerazione come i dati viene passato nel vostro motore di regole, come una volta che le regole di iniziare a sparare, e alcune regole rende le chiamate ad un DB, allora sicuramente avrà problemi di prestazioni. la pratica migliore è quella di dare a tutti i dati necessari per l'esecuzione regola alla partenza in sé, anche se questo ha alcuni svantaggi troppo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top