Pergunta

Estou prestes a mergulhar em um projeto de regras orientado (usando ILOGs Rules for .NET - agora IBM). E eu li um par de perspectivas diferentes sobre como configurar as regras de processamento e como interagir com o mecanismo de regras.

Os dois principais pensamentos que tenho visto é centralizar o mecanismo de regras (em sua própria fazenda de servidores) e um programa contra a fazenda através de uma API de serviços web (ou no caso do ILOG via WCF). O outro lado é executar uma instância do mecanismo de regras em cada um dos servidores de aplicação e interagir com ele localmente com cada instância ter a sua própria cópia das regras.

O lateral-se à centralização é a facilidade de implantação das regras para um local centralizado. As regras dimensionar como eles precisam, em vez de escalar cada vez que você expandir sua configuração de servidor de aplicativos. Isso reduz o desperdício de uma perspectiva licença adquirida. O plumas lado desta configuração é o adicionado sobrecarga de fazer chamadas de serviço, latência de rede, etc.

A / desvantagem de cabeça para execução localmente o motor regra é exatamente o oposto da cabeça / desvantagem da configuração centralizada. Nenhuma chamada lento serviço (chamadas rápido API), há problemas de rede, cada servidor de aplicativo se baseia em auto. Gerenciando a implantação de regras torna-se mais complexa. Cada vez que você adicionar um nó a sua nuvem aplicativo que você vai precisar de mais licenças para os motores de regras.

Na leitura white papers vejo que a Amazon está executando o mecanismo de regras por configuração de servidor de aplicações. Eles parecem fazer uma implantação lenta de regras e reconhecer que o atraso na publicação regra é "aceitável", apesar de lógica de negócio está fora de uma sincronização para um determinado período de tempo.

Pergunta:? De suas experiências, o que é a melhor maneira de começar a integrar regras em um aplicativo web .net com base em uma loja que ainda não passou muito tempo trabalhando em um regras mundo movido

Foi útil?

Solução

Estamos usando ILOG Para DotNet e têm um projeto piloto implantado.

Aqui está um resumo da nossa imatura Regras Arquitetura:

  1. Todos os dados de acesso feito fora das regras.
  2. As regras são implantadas da mesma forma que o código (controle de origem, processo de liberação, yada yada).
  3. Projetos (serviços) que usam Regras ter uma referência para ILOG.Rules.dll e novos-up RuleEngines via uma classe pooling personalizado. RuleEngines são agrupados porque é caro para vincular um conjunto de regras para um RuleEngine.
  4. Quase todas as regras são escritas para esperar Assert'd objetos, em vez de parâmetros de fluxo de regra.
  5. Uma vez que as regras são executados no mesmo espaço de memória, os casos que são modificados pelas regras são as mesmas instâncias no programa -. Que é a propagação imediata de estado
  6. Quase todas as regras são executadas através de fluxo de regra (mesmo que seja um único RuleStep no fluxo de regra).

Nós estamos olhando para RuleExecutionServer como uma plataforma de hospedagem, bem como RuleTeamServerForSharePoint para ser o anfitrião de fonte regras. Eventualmente, teremos Regras implantado para fora da produção do processo de liberação de código.

O principal obstáculo em todos os nossos esforços regra é Modelagem e regra de criação de habilidades.

Outras dicas

Eu nunca gostei do argumento centralização. Isso significa que tudo o que é acoplado no motor de regras, que se torna uma lixeira para todas as regras do sistema. Em breve você não pode mudar nada por medo do desconhecido: "O que vamos quebrar"

Eu prefiro muito mais seguinte idéia da Amazon de serviços como componentes isolados e autônomos. Eu interpreto isso como significando que os serviços possuem seus dados e suas regras .

Isto tem o benefício adicional de particionamento do espaço regras. Um conjunto de regras torna-se mais difícil de manter à medida que cresce; melhor mantê-los a um tamanho administrável.

Se partes do conjunto de regras são compartilhados, eu prefiro uma abordagem DI dados-driven, onde um serviço pode ter sua própria instância de um mecanismo de regras e carregar as regras comuns a partir de um banco de dados na inicialização. Isto pode não ser viável se a sua licença iLog faz várias instâncias custo proibitivo. Isso seria um caso em que o produto que é suposto estar a ajudar pode realmente estar ditando as escolhas de arquitetura que vai trazer dor. Seria um bom argumento para uma alternativa menos dispendiosa (por exemplo, JBoss Rules em Java-terra).

Que tal uma abordagem de árvore de decisão baseada em dados? É mecanismo de regras realmente necessário um Rete, o é a decisão "ferramenta empresarial" dirigir a sua escolha?

Eu ia tentar configurar o mecanismo de regras por isso foi como dissociado do resto da empresa quanto possível. Eu não teria que chamar a bancos de dados ou serviços, se pudesse. Melhor fazer que a responsabilidade dos objetos pedindo uma decisão. Deixe-os chamar para os serviços web necessários e bases de dados para reunir os dados necessários, passá-lo para o mecanismo de regras, e deixá-lo fazer a sua coisa. Acoplamento é seu inimigo: Tentar projetar seu sistema para minimizá-lo. Manter mecanismos de regras isolado é uma boa maneira de fazê-lo.

Eu não tenho muito a dizer sobre a questão "qual o servidor", mas peço-lhe para desenvolver serviços de decisão - serviços exigível que as regras de uso para tomar decisões, mas que não alteram o estado do negócio. Deixando a chamar aplicativo / serviço / processo de decidir quais os dados alterações a fazer, como resultado de chamar o serviço de decisão e ter o componente de chamada realmente iniciar a ação (s) sugeridos pelo serviço de decisão torna mais fácil usar o serviço de decisão mais e mais novamente (em todos os canais, processa etc). O mais limpo e menos ligado ao resto da infra-estrutura do serviço de decisão o mais reutilizável e gerenciável que vai ser. A discussão aqui na ebizQ pode valer a pena a leitura a este respeito .

Na minha experiência com mecanismos de regras, nós aplicamos um conjunto bastante básico de práticas para governar a interação com o mecanismo de regras. Primeiro de tudo, estes foram sempre comerciais regras motores (Ilog, Corticon) e de origem não aberta (Drools), daí implantar localmente para cada um dos servidores de aplicativos nunca foi realmente uma opção viável devido aos custos de licenciamento. Por isso, temos ido sempre com o modelo centralizado, embora em dois sabores primários:

  • Execução Remota de Serviço Web - Da mesma forma que você especificou na sua pergunta, nós fazer chamadas para serviços baseados em SOAP fornecidas pelo produto mecanismo de regras. Dentro do reino serviço web, que vieram em cima de várias opções: (1) "Boxcar" os pedidos, permitindo a aplicação de fila regras de processamento de pedidos e enviá-los em pedaços ao invés de mensagens one-off; (2) Ajuste as opções de segmentação e de processos fornecidos pelo fornecedor. Isto inclui permitindo que separam serviços de decisão por função e atribuição de cada um W3WP e / ou utilizando jardins web. Há uma grande quantidade horrível de ajustes você pode fazer com vagões, segmentos e processos e obter a mistura certa é mais um processo de tentativa e erro (e sabendo que seus conjuntos de regras e dados) do que uma ciência exata.
  • remotamente Chame o Mecanismo de regras no Processo - Um truque de estilo clássico lote para evitar a sobrecarga de serialização e de-serialização. Remotamente fazer uma chamada que os incêndios uma chamada em processo para o motor de regras. Isso pode ser feito (por exemplo lote) quer programada ou com base na demanda (ou seja, "vagões" de pedidos). De qualquer maneira um monte da sobrecarga das chamadas de serviço pode ser evitado, interagindo diretamente com o processo e banco de dados. Desvantagem deste processo é que você não tem o IIS ou o EJB / container Servlet gerir os fios para você e você tem que fazê-lo sozinho.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top