Zum Inhalt springen

Unabhängiges F&E-Projekt · Köln

Regeln als Daten

Entscheidungsregeln werden unabhängig vom Anwendungscode versioniert, und jede Entscheidung behält den Nachweis der Regelversion, die sie erzeugt hat.

Nicht normativ

Companion-Version
1.0
Bezug zu COADF Core
2.2
Status
Aktuell
Zuletzt geprüft
COADF-Prinzipien
P-8

Architektureigenschaft

COADF P-8, wie veröffentlicht: Die Regeln, an denen eine Entscheidung gemessen wird, sind Daten, die Engine, die sie auswertet, ändert sich nicht, wenn sich eine Regel ändert, und ein Entscheidungssatz ist an die Version des Regelwerks gebunden, die ihn erzeugt hat, was die Spur aus P-4 in die Herkunft der Regeln hinein verlängert. COADF benennt den Stand der Technik selbst: Regelwerke, die sich neu laden lassen, mit Entscheidungssätzen, die mit ihrer Version verknüpft sind, gibt es bereits, und Open Policy Agent ist das naheliegende Beispiel.

COADF hält einen Teil von P-8 zurück und sagt das auf seiner Seite zu den Prinzipien. Nichts auf dieser Seite beschreibt diesen Teil. Die Beispiele verwenden einen bewusst generischen Gegenstand: welche Features eine Deployment-Umgebung aktivieren darf.

Warum sie wichtig ist

Regeln ändern sich häufiger als Code, und aus anderen Gründen: eine Leitlinie einer Aufsichtsbehörde, ein Vertrag, ein neuer Markt. Lebt eine Regel im Code, ist jede Änderung ein Release, mehrere Dienste driften auseinander, und niemand kann sagen, welche Version einer Regel eine Entscheidung aus dem letzten Quartal erzeugt hat.

Das letzte Problem ist das teure. Eine Entscheidung, die sich nicht rekonstruieren lässt, lässt sich nicht erklären, und eine Entscheidung, die sich nicht erklären lässt, lässt sich nicht verteidigen.

Zulässige Umsetzungsstrategien

Die Form ist klein: Die Anwendung fragt über eine Schnittstelle an, die ihr gehört, die Schnittstelle zieht versioniertes Policy-Material heran, und die zurückkommende Entscheidung trägt die Revision dieses Materials.

Beispielarchitektur · Nicht normativ

Regeln als Daten

Beispielarchitektur, nicht normativ: Eine Anwendung fragt eine Policy-Schnittstelle, die eine Engine fragt; die Engine liest versioniertes Policy-Material und gibt eine Antwort zurück, die mit ihrer Revision festgehalten wird.Eine Anwendung sendet ihre Frage als Eingabe an eine Policy-Schnittstelle, die der Anwendung gehört. Die Schnittstelle fragt eine Policy-Engine, die sich nicht ändert, wenn sich die Regeln ändern. Die Engine liest versioniertes Policy-Material, Revision r, als Daten. Die Antwort der Engine wird als Entscheidungseintrag festgehalten, der die Antwort und Revision r trägt.AnwendungPolicy-Schnittstellegehört derAnwendungPolicy-Engineunverändert, wennRegeln sich ändernPolicy-Materialversionierte Daten,Revision rEntscheidungseintragAntwort undRevision rEingabeals Daten gelesenAntwort
  • Datenfluss in diesem Beispiel
Die Anwendung fragt über eine Schnittstelle, die ihr gehört. Die Engine ändert sich nicht, wenn sich die Regeln ändern; das Material sind versionierte Daten, und jede Antwort wird mit der Revision festgehalten, die sie erzeugt hat.

Textbeschreibung. Eine Anwendung sendet ihre Frage als Eingabe an eine Policy-Schnittstelle, die der Anwendung gehört. Die Schnittstelle fragt eine Policy-Engine, die sich nicht ändert, wenn sich die Regeln ändern. Die Engine liest versioniertes Policy-Material, Revision r, als Daten. Die Antwort der Engine wird als Entscheidungseintrag festgehalten, der die Antwort und Revision r trägt.

  • Eine Policy-Schnittstelle, die der Anwendung gehört. Die Anwendung stellt eine Frage in ihren eigenen Begriffen, und die Engine sitzt hinter einem Adapter.
  • Versioniertes Policy-Material. Regeln und ihre Daten sind Artefakte mit einer Kennung pro Revision, unabhängig von der Anwendung deployt.
  • Die Revision an jeder Entscheidung. Der Entscheidungssatz trägt die Antwort, die Revision und genug von der Eingabe, um sie erneut auszuführen.
  • Alte Revisionen bleiben abrufbar. Eine erneute Ausführung braucht das Material, wie es war, nicht wie es ist.
  • Reproduzierbare Auswertung. Eine Policy, die während der Auswertung Daten abruft oder die Uhr liest, lässt sich nicht allein aus ihrer Eingabe und ihrer Revision erneut ausführen. Solche Fakten werden als Eingabe übergeben und festgehalten.
  • Auch die Engine versioniert. Ein Upgrade der Engine kann Bedeutung ändern: OPA 1.0 hat die Schlüsselwörter if und contains zur Pflicht gemacht, zum Beispiel. Die Version der Engine wird überall festgehalten, wo es auf erneute Ausführung ankommt.
  • Kontrolliertes Scheitern. Eine unbekannte Revision, eine fehlende Revision, eine fehlerhafte Antwort oder eine nicht erreichbare Engine erzeugt ein Ergebnis, das die für die Regel verantwortliche Stelle vorab gewählt hat, nie einen nicht festgehaltenen Standardwert. Eine allgemeingültige richtige Antwort gibt es nicht: Die Aktion zu verweigern ist richtig für eine Regel zum Feature-Zugriff wie im Beispiel des Python-Profils; für eine andere Entscheidung legt die verantwortliche Stelle fest, was Scheitern bedeutet, und hält die Wahl fest.

Technologieoptionen

Fehlermuster

  1. Regeln in mehreren Diensten dupliziert oder fest einprogrammiert

    Jede Kopie wird nach eigenem Zeitplan geändert, und dieselbe Anfrage wird an einer Stelle erlaubt und an einer anderen abgelehnt.

  2. Die Revision nicht mit dem Ergebnis aufbewahrt

    Die Entscheidung existiert; welche Regeln sie erzeugt haben, nicht.

  3. Ein Neuladen der Regeln ändert die Bedeutung historischer Entscheidungen

    Ein Bericht berechnet die Entscheidungen des letzten Monats mit den heutigen Regeln neu und stellt sie als die des letzten Monats dar.

  4. Umgebungen mit unterschiedlichen Revisionen ohne Herkunft

  5. Eine alte Entscheidung lässt sich nicht rekonstruieren

    Das Material wurde überschrieben, oder die Auswertung hing von Daten ab, die im Moment ihrer Ausführung abgerufen wurden.

  6. Undefiniert als Antwort gelesen

    In Rego ist eine Regel, deren Eingabe fehlt, undefiniert, und an ihrer Stelle antwortet ein Default. Ein falsch geschriebener Eingabeschlüssel fällt daher stillschweigend auf den Default zurück, was die eigenen Tests des Beispiels festschreiben. Ein Vertragstest auf der Seite des Aufrufers fängt den Schreibfehler ab.

  7. Ein Entscheidungs-Cache, der die Revision ignoriert

    Aus dem alten Material gecachte Antworten überdauern den Rollout des neuen.

  8. Eine nicht erreichbare Engine als Erlaubnis behandelt

    Ein Client, der erlaubt, wenn die Engine nicht antwortet, macht aus einem Ausfall eine Policy.

Verifikation

  • Unit-Test

    Bestanden, wenn: Die eigenen Tests der Regeln laufen gegen ihr Material: opa test führt jede Regel mit dem Präfix test_ aus, und eine Regeltabelle hat das Gegenstück dazu.

    Zahnbeweis: Das Material ändern: Die Tests, die die alten Antworten festschreiben, schlagen fehl, während die Regel selbst unverändert ist.

  • Integrationstest

    Bestanden, wenn: Jede festgehaltene Entscheidung nennt eine Revision, und zwar die Revision des geladenen Materials.

    Zahnbeweis: Material ohne Revision laden: Der Client verweigert, eine Entscheidung festzuhalten.

  • Integrationstest

    Bestanden, wenn: Dieselbe Eingabe unter derselben Revision ergibt dieselbe Antwort, erneut ausgeführt gegen archiviertes Material.

  • Vertragstest

    Bestanden, wenn: Die Eingabe, die die Anwendung sendet, ist die Eingabe, die die Policy liest.

    Zahnbeweis: Ein Eingabefeld auf einer Seite umbenennen: Der Vertragstest schlägt fehl, statt dass die Policy auf ihren Default zurückfällt.

  • Deployment- oder Admission-Test

    Bestanden, wenn: Jede Umgebung meldet die Revision, die sie ausführt, und die Meldung wird mit dem Release-Protokoll abgeglichen.

  • Manueller Nachweis

    Bestanden, wenn: Eine Stichprobe historischer Entscheidungen wird gegen die Revisionen erneut ausgeführt, die sie festgehalten haben.

Alternative Umsetzungen

  • Regeln im Code, mit der Build-Revision an jeder Entscheidung. Für ein kleines System gangbar. Jede Regeländerung ist dann ein Release, und die Engine ändert sich mit jeder Regel, was P-8 ausschließt.
  • Feature-Flag-Dienste. Policy-ähnlich und oft ohne Herkunft der Entscheidung: Welche Flag-Konfiguration eine bestimmte Anfrage beantwortet hat, wird häufig nicht festgehalten.
  • Ein Entscheidungsdienst, der einem anderen Team gehört, über dieselbe Schnittstelle genutzt, mit der Revision in seiner Antwort.

Grenzen

  • Das Muster liefert Herkunft, nicht Korrektheit. Eine sauber versionierte falsche Regel bleibt falsch.
  • Es deckt weder die Teile von P-8 ab, die COADF nicht veröffentlicht, noch, wie eine Policy-Entscheidung mit irgendeiner anderen Kontrolle zusammentrifft.
  • Open Policy Agent ist eine Beispiel-Engine. Nichts hier macht sie zur Voraussetzung.

Quellen

COADF Engineering Companion 1.0 · nicht normativ · bezieht sich auf COADF Core 2.2

Veröffentlichungsrechte vorbehalten. Für den COADF Engineering Companion 1.0 und seine Referenzbeispiele wird derzeit keine öffentliche Lizenz erteilt.

Schutzrechts- und Veröffentlichungsstatus