Pergunta

Eu tenho tido uma olhada WF Rules Engine e NxBRE e parece interessante, mas não estou certo de quão bem ele irá realizar em cenários da vida real .

O que eu tenho em mente é algo como uma base de verdade, com entre 10 e 100 milhões de fatos e regras como:

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

Eu estou usando C # e .NET.

Editar: eu não fui claro (totalmente minha culpa) :) Eu tenho meu próprio sistema de avaliação de regra que usa o algoritmo RETE si ... é bastante rápido, ele pode avaliar o cenário de 10 milhões de facto em cerca de 10 segundos ... o quão rápido são soluções comerciais em comaparison?

Foi útil?

Solução

A resposta curta é que eu esperaria um mecanismo de regras para superar uma solução imperativo uma vez que o número de regras excede alguns (eu não sei o valor exato) valor limite.

O regras parte de um mecanismo de regras é um conjunto de condições e ações. A única regra é (quase) funcionalmente equivalente a um se - declaração seguida. O verdadeiro poder de um motor de regras brilha através devido à natureza declarativa do motor.

Em um programa imperativo tradicional, você tem que código como a lógica é avaliada. Ao usar um mecanismo de regras, que determina quantas das suas declarações são avaliadas. Eu só tenho motores usados ??como Jess ou CLIPS , que usar um rete algoritmo para descobrir quais as regras para o fogo. É a eficiência de suas regras de disparo algoritmo que vai dirigir o quanto mais eficiente o mecanismo de regras irá realizar mais de uma solução imperativo tradicional.

O algoritmo Rete é projetado para sacrificar memória para aumentar a velocidade. Ele mantém uma rede de nós mapeando padrões secundários LHS de regras. Quanto mais regras e fatos que você tiver, melhor sua rede rete irá superar a sua solução imperativo, porque o desempenho Rete é teoricamente independente do número de regras no sistema.

Você está pensando em um monte de fatos. Se você pretende ter um monte de regras, você pode se deparar com problemas de memória.

Dê uma olhada no artigo de Martin Fowler sobre governa motores . É uma boa e (muito) breve resumo.

uma discussão longa sobre o Business Rules Engine Microsoft (MS-BRE) adn seu desempenho em comparação com Jess & Drools. Vários dos pontos levantados sublinhado por que essas avaliações são difíceis.

Outras dicas

O "boato que não é uma implementação rete fiel" refere-se a um problema antigo relativo a um crédito que o Business Rule Engine incluído no BizTalk Server falhar para implementar o algoritmo Rete corretamente. A alegação era incorreta, pelo caminho. O BRE certamente não implementar Rete. O motor de regras WF é uma tecnologia totalmente diferente do BRE. Como diz Karl, o WF mecanismo de regras não implementa Rete em tudo, seja correta ou incorretamente. É um exemplo do que pode vagamente ser chamado de 'sequencial' motor. Ele implementa uma forma de encadeamento para a frente. No entanto, os problemas reais são um pouco mais complexa do que isso. O bit 'para frente' refere-se ao tipo de raciocínio lógico que um motor pode fazer. O termo não é realmente dizer nada sobre os mecanismos envolvidos na execução. A verdadeira questão é sobre o quão bom um motor está no raciocínio. Sim, WF pode encaminhar de cadeia, e sim ele pode raciocinar, mas apenas de forma bastante limitada. A Rete ofertas motor capacidades de raciocínio mais forte, mas este é realmente nada a ver com o uso do algoritmo Rete que é realmente apenas uma otimização para uma certa classe de mecanismo de regras chamado de sistema de 'produção'. É a ver com a forma como um sistema de produção pode raciocinar sobre um todo 'base fato' ao passo que o mecanismo de regras WF sequencial pode apenas directamente razão sobre o equivalente aproximado de um único fato. Problemas às vezes surgem porque as pessoas confundem um mecanismo de tempo de execução específica que permite a frente encadeamento com o processo lógico de encadeamento-se para a frente (e depois de tudo, que é bastante uma distinção sutil). O mecanismo relevante em WF pode, certamente, ser utilizado à razão de uma forma 'para a frente' a uma extensão limitada, mas a sua principal utilização é para permitir que as regras sequenciais para ser expresso numa forma semi-declarativa - isto é, as regras podem ser expressas em qualquer sequência independentemente das dependências processuais entre essas regras. Isso não tem nada a ver com o raciocínio para a frente ou, de fato, o processo loical de encadeamento para a frente.

A questão é um pouco complexo e obscuro, e eu sei que alguns dos rapazes no MS não concordam comigo sobre isso (nós discutimos isso com bastante frequência), mas essa é a minha opinião sobre ele.

Uma coisa a ser muito conscientes de que é o WF mecanismo de regras é que ele realmente implementa seu próprio analisador e, como resultado, é um pouco limitado em sua expressividade e tem considerações de desempenho, uma vez que é praticamente fazendo análise de cadeia de interpretar as regras em código (ações executáveis) em tempo de execução.

Corremos 24 milhões de testes por meio de 1500 regras em sete minutos usando JBoss Drools com duas JVMs rodando em muito danado servidores médios. Isso é mais de trinta seis bilhões testes a serem executados se você executou todas as combinações, e a maioria dos testes têm múltiplas escolhas lógicas em si. (Seu exemplo tem três opções, por exemplo.)

você também tem que considerar como os dados são passados ??em seu mecanismo de regra, como uma vez as regras começando a fogo, e algumas regras faz chamadas para um DB, então certamente terá problemas de desempenho. a melhor prática é dar a todos os dados necessários para a execução de regras no próprio começar, embora este tem alguns contras também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top