Hoch skalierbare und dynamische „regelbasierte“ Anwendungen?


8

Für eine große Unternehmensanwendung weiß jeder, dass die Fähigkeit, sich an Veränderungen anzupassen, einer der wichtigsten Aspekte des Designs ist. Ich verwende häufig einen regelbasierten Ansatz, um mich mit der Änderung der Geschäftslogik zu befassen, wobei jede Regel in einer Datenbank gespeichert wird. Dies ermöglicht einfache Änderungen, ohne in böse Details einzutauchen. Da C # nicht ausgewertet werden kann ("foo (bar);"), wird dies durch die Verwendung formatierter Zeichenfolgen erreicht, die in Zeilen gespeichert sind, die dann zur Laufzeit in JavaScript verarbeitet werden. Dies funktioniert gut, ist jedoch weniger als elegant und würde für niemanden anderen am angenehmsten sein, wenn es einmal zum Vermächtnis wird.

Gibt es dafür eine elegantere Lösung? Wenn Sie in Tausende von Regeln geraten, die sich ziemlich häufig ändern, wird dies zu einem echten Bären, aber dies kann nicht so ungewöhnlich sein, dass jemand nicht über einen besseren Weg nachgedacht hat, dies zu tun. Irgendwelche Vorschläge? Ist diese derzeitige Methode vertretbar? Was sind die Alternativen?

Bearbeiten: Nur um zu verdeutlichen, dies ist eine große Unternehmens-App. Unabhängig davon, welche Lösung funktioniert, werden viele Leute ständig ihre Regeln und Daten pflegen (ca. 10). Außerdem ändern sich die Daten häufig genug, um zu sagen, dass eine Art zentrales Serversystem grundsätzlich ein Muss ist.


2
Ich habe fast Angst, das Ergebnis zu sehen ...
TheLQ

Es ist bemerkenswert , dass C # kann durch Reflexion und CompilerServices eval.
Deer Hunter

Antworten:


12

Ich würde WF oder Drools verwenden, wenn Sie versuchen, eine Abstraktion zu erstellen, mit der Nicht-Programmierer arbeiten könnten, um Geschäftsregeln zu entwickeln. Wenn Sie jedoch mit Programmierern zu tun haben, ist die Abstraktion von WF nicht die Zeit wert, die für die Entwicklung einer Lösung erforderlich ist. Ich sehe keinen Mehrwert für Ihre Investition.

Eine Datenbank ist eine gute Möglichkeit, Regeln zu pflegen, die sich möglicherweise stark ändern. Lassen Sie mich jedoch eine mögliche Alternative vorschlagen (nicht unbedingt besser, aber eine Alternative).

1) Teilen Sie die Geschäftslogik in eine eigene Ebene (DLL) auf - abstrahieren Sie, wie Sie sie aufrufen, mit einigen Schnittstellen (siehe Strategie und Beobachtermuster), z. B. IRuleEvaluator.Evaluate (Zeichenfolge myParams).

2) Jetzt können Sie für jede Regel (falls erforderlich) und zugehörige Komponententests diskrete Klassen erstellen.

3) Verkabeln Sie nun für das Pièce de résistance alles hinter den Kulissen in einem IOC-Container - die DLL und die Regelauswertungsinstanz selbst. Auf diese Weise wird Ihr Regelauswerter zur Laufzeit durch die Konfiguration erstellt - nichts ist fest zusammen codiert.

Dieser Ansatz ist sehr dynamisch (möglicherweise für einige Geschmäcker zu dynamisch) - er ermöglicht es Ihnen, tatsächliche diskrete Komponententests für alle Ihre Regeln durchzuführen. Wenn Sie eine Regel erneut bereitstellen oder ändern müssen, können Sie eine neue DLL löschen, Ihre IOC-Konfigurationsdatei ändern, neu starten und überprüfen - oder die Änderung zurücksetzen, wenn etwas nicht stimmt -, ohne Ihren Kerncode zu ändern (genau wie a Datenbank). Und im Gegensatz zu einer Datenbank werden Logik und Anwendungscode unter einem Dach zusammengefasst, anstatt zur Hälfte in C # und zur Hälfte in SQL geschrieben.


1

Es gibt zwei Fälle von Regeln, die ich gesehen habe. In den meisten Fällen ist die Regel selbst nicht sehr volatil (fast festgelegt), aber die Daten, über die entschieden wird, können von Geschäftsbenutzern geändert werden. In diesem Fall reichen normalerweise einfache Entwurfsmuster aus, um jede Regel mit dem Lesen der Referenzdaten aus der Datenbank zu kapseln. Stellen Sie dann ein Frontend bereit, um die Regelreferenzdaten zu ändern.

Die anderen Fälle, in denen die Regellogik selbst dynamisch geändert werden kann. Ein Ansatz wäre, IronPython oder andere dynamische Sprachen (in .Net 4) zu verwenden, um die Regeln zu implementieren und sie zur Ausführungszeit dynamisch zu laden. Dies ist ein Kompromiss, da Sie weiterhin Programmierer benötigen, um die Regeln zu ändern.

Wenn Sie wirklich möchten, dass Regeln von Geschäftsbenutzern bearbeitet werden können, sollten Sie DSL für Ihre Geschäftsdomäne erstellen. Dies ist jedoch ein komplexes Unterfangen.

Schließlich kann die Verwendung von Workflow oder BizTalk hilfreich sein, wenn die Regeln in Transformations- / Orchestrierungsmuster passen.


1

Wenn Sie eine hoch skalierbare "regelbasierte" Anwendung entwerfen, bei der Regeln häufig geschäftlichen Änderungen unterliegen, sollten Sie marktführende BRMS-Produkte in Betracht ziehen, z. B.: 1. IBM WODM 2. FICO BLAZE Advisor 3. Drools (Open Source)

Ich habe an großen kommerziellen Anwendungen mit einem BRMS-Ansatz gearbeitet, die sie hoch skalierbar und wartungsfreundlich machen und sie auch mit NULL Ausfallzeiten bis zur Produktion sehr flexibel machen. Es macht das Geschäft glücklich. :) :)


0

Ich gehe davon aus, dass Sie sich nicht ausschließlich auf clientseitige Operationen bezogen haben und sich in .Net befinden, seit Sie c # ...

Wenn Sie sich in Framework 4 befinden, haben Sie das DLR (Dynamic Language Runtime) oder in einem beliebigen Framework, wenn Sie die Regeln in SQL speichern, können Sie sie auch dort verarbeiten oder Sie können jederzeit Dynamic Linq in den> 3 Frameworks verwenden oder die verschiedenen Funktionen schreiben als Assemblys, die zur Laufzeit über eine Assembly geladen werden können.

Nicht alle davon sind in vielen Fällen elegant, aber ich musste sie alle manchmal verwenden.


0

Eine Sache, die mir in den Sinn kommt, ist Windows Workflow Foundation , das zusammen mit ASP.NET verwendet werden kann, aber auf der Serverseite ausgeführt wird (daher ist es möglicherweise nicht auf Ihre Arbeit anwendbar). In Java Land gibt es jBPM (Business Process Management), das auch auf der Serverseite ausgeführt wird.

Da diese Lösungen wahrscheinlich nicht zu Ihnen passen würden , ist es möglicherweise am besten, diese Geschäftsregeln in einfachem alten Code (unter Verwendung von Javascript, C # oder was auch immer für den Job am besten ist) zu implementieren und zu erwarten, dass der Programmiercode dies tut müssen aktualisiert werden, wenn Designänderungen auftreten. Durch die Verwendung objektorientierter Entwurfsmuster kann der Code leicht erweitert werden. Wenn Sie den Code gut schreiben, sollte der Aufwand für eine zukünftige Änderung minimal sein.


Tatsächlich ist dies eine sehr große Unternehmensanwendung, und WF ist sicherlich eine Möglichkeit.
Morgan Herlocker

0

Wenn Ihre Regeln alle eine Form haben

if <condition>
then <action>
[else <action]

Sie können Drools.NET oder eine andere Rete-Implementierung wie iLog verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.