Ich bin dabei, in ein regelorientiertes Projekt einzutauchen (mit ILOGs Rules for .NET - jetzt IBM). Und ich habe ein paar verschiedene Ansichten darüber gelesen, wie man die Verarbeitung von Regeln einrichtet und wie man mit der Regel-Engine interagiert.
Die beiden wichtigsten Gedanken, die ich gesehen habe, sind die Zentralisierung der Regel-Engine (in ihre eigene Farm von Servern) und die Programmierung gegen die Farm über eine Web-Service-API (oder im Fall von ILOG über WCF). Die andere Seite besteht darin, auf jedem Ihrer App-Server eine Instanz der Regel-Engine auszuführen und lokal mit ihr zu interagieren, wobei jede Instanz eine eigene Kopie der Regeln hat.
Der Vorteil der Zentralisierung ist die einfache Bereitstellung der Regeln an einem zentralen Ort. Die Regeln werden bei jeder Erweiterung der Anwendungsserverkonfiguration skaliert, anstatt sie zu skalieren. Dies reduziert die Verschwendung von gekauften Lizenzen. Der Nachteil dieser Einrichtung ist der zusätzliche Aufwand für Serviceanrufe, Netzwerklatenz usw.
Die Oberseite / Unterseite des lokalen Laufs der Regel-Engine ist das genaue Gegenteil der oberen / unteren Seite der zentralisierten Konfiguration. Keine langsamen Serviceaufrufe (schnelle API-Aufrufe), keine Netzwerkprobleme, jeder App-Server ist selbst darauf angewiesen. Die Verwaltung der Bereitstellung von Regeln wird komplexer. Jedes Mal, wenn Sie einen Knoten zu Ihrer App-Cloud hinzufügen, benötigen Sie mehr Lizenzen für Regel-Engines.
Beim Lesen von Whitepapers sehe ich, dass Amazon die Regel-Engine pro App-Server-Konfiguration ausführt. Sie scheinen eine langsame Bereitstellung von Regeln durchzuführen und erkennen, dass die Verzögerung bei der Regelveröffentlichung "akzeptabel" ist, obwohl die Geschäftslogik für einen bestimmten Zeitraum nicht synchronisiert ist.
Frage: Was ist Ihrer Meinung nach der beste Weg, Regeln in eine .net-basierte Web-App für einen Laden zu integrieren, der noch nicht viel Zeit in einer regelbasierten Welt verbracht hat?
Wir verwenden ILOG für DotNet und haben ein Pilotprojekt im Einsatz.
Hier ist eine Zusammenfassung unserer unreifen Regeln Architektur:
ILOG.Rules.dll
und new-up RuleEngines über eine benutzerdefinierte Pooling-Klasse. RuleEngines werden zusammengefasst, da es sehr aufwendig ist, einen RuleSet an eine RuleEngine zu binden. Wir betrachten RuleExecutionServer als Hosting-Plattform sowie RuleTeamServerForSharePoint als Host für die Regelquelle. Schließlich werden Regeln außerhalb des Code-Release-Prozesses für die Produktion bereitgestellt.
Das Haupthindernis in all unseren Regelbemühungen ist das Skillset Modellieren und Regelnerstellen.
Ich mochte das Zentralisierungsargument nie. Es bedeutet, dass alles in die Regelengine eingekoppelt wird, die zu einem Abladeplatz für alle Regeln im System wird. Ziemlich bald kann man aus Angst vor dem Unbekannten nichts ändern: "Was werden wir brechen?"
Ich ziehe es vor, Amazons Idee von Dienstleistungen als isolierte, autonome Komponenten zu verfolgen. Ich interpretiere das so, dass Dienste ihre Daten und ihre Regeln besitzen.
Dies hat den zusätzlichen Vorteil, den Regelbereich zu partitionieren. Ein Regelsatz wird schwieriger zu pflegen, wenn er wächst. besser, sie auf eine überschaubare Größe zu halten.
Wenn Teile des Regelsatzes freigegeben sind, würde ich eine datengesteuerte DI-Methode bevorzugen, bei der ein Service seine eigene Instanz einer Regel-Engine haben und beim Start die allgemeinen Regeln aus einer Datenbank laden kann. Dies ist möglicherweise nicht machbar, wenn Ihre iLog-Lizenz mehrere Instanzen zu teuer macht. Das wäre ein Fall, in dem Produkte, die helfen sollen, tatsächlich architektonische Entscheidungen diktieren, die Trauer bringen. Es wäre ein gutes Argument für eine weniger teure Alternative (z. B. JBoss-Regeln in Java-Land).
Was ist mit einem datengesteuerten Entscheidungsbaum-Ansatz? Ist eine Rete-Regel-Engine wirklich notwendig, o ist die "Enterprise-Tool" -Entscheidung Ihre Wahl?
Ich würde versuchen, die Regelengine so einzurichten, dass sie so weit wie möglich vom Rest des Unternehmens abgekoppelt ist. Ich würde es nicht zu Datenbanken oder Diensten rufen, wenn ich könnte. Besser, die Verantwortung der Objekte zu übernehmen, die um eine Entscheidung bitten. Lassen Sie sie die notwendigen Web-Services und Datenbanken aufrufen, um die notwendigen Daten zu sammeln, sie an die Rules-Engine zu übergeben und sie ihre Sache machen zu lassen. Kopplung ist dein Feind: Versuche dein System so zu gestalten, dass es minimiert wird. Es ist eine gute Möglichkeit, Regel-Engines isoliert zu halten.
Ich habe nicht viel zu sagen über die Frage "welcher Server", aber ich würde Sie dringend bitten, Entscheidungsdienste zu entwickeln - abrufbare Dienste, die Regeln verwenden, um Entscheidungen zu treffen, die aber den Geschäftszustand nicht ändern. Wenn die anrufende Anwendung / Dienst / Prozess entscheiden, welche Datenänderungen als Ergebnis des Aufrufs des Entscheidungsdienstes vorgenommen werden und die aufrufende Komponente die vom Entscheidungsdienst vorgeschlagene (n) Aktion (en) tatsächlich initiiert, erleichtert dies den Entscheidungsdienst immer wieder wieder (über Kanäle, Prozesse usw.). Je sauberer und weniger an den Rest der Infrastruktur gebunden ist, desto entscheidungsfähiger ist der Service, desto mehr wiederverwendbar und überschaubar wird es. Die Diskussion hier auf ebizQ könnte in dieser Hinsicht lesenswert sein.
Nach meiner Erfahrung mit Rules-Engines haben wir eine ziemlich einfache Reihe von Methoden angewendet, um die Interaktion mit der Rules-Engine zu steuern. Vor allem waren dies immer kommerzielle Rules-Engines (iLog, Corticon) und nicht Open Source (Drools), daher war die Bereitstellung lokal auf jedem der App-Server aufgrund der Lizenzkosten nie wirklich eine praktikable Option. Daher sind wir immer mit dem zentralisierten Modell gegangen, wenn auch in zwei Hauptgeschmacksrichtungen:
Tags und Links websphere rule-engine