Aller au contenu

Projet indépendant de R&D · Cologne

Les règles comme données

Les règles de décision sont versionnées indépendamment du code de l'application, et chaque décision garde la provenance de la version des règles qui l'a produite.

Non normatif

Version du Companion
1.0
Se rapporte à COADF Core
2.2
Statut
À jour
Dernière relecture
Principes COADF
P-8

Propriété d'architecture

COADF P-8, tel que publié : les règles auxquelles une décision est mesurée sont des données, le moteur qui les évalue ne change pas quand une règle change, et un enregistrement de décision est lié à la version du jeu de règles qui l'a produit, ce qui prolonge la trace de P-4 jusqu'à la provenance des règles. COADF nomme lui-même l'état de la technique : des jeux de règles rechargeables, avec des enregistrements de décision liés à leur version, existent déjà, et Open Policy Agent en est l'exemple évident.

COADF ne publie pas une partie de P-8, et le dit sur sa page des principes. Rien sur cette page ne décrit cette partie. Les exemples utilisent un sujet volontairement générique : les fonctionnalités qu'un environnement de déploiement peut activer.

Pourquoi elle compte

Les règles changent plus souvent que le code, et pour d'autres raisons : les orientations d'un régulateur, un contrat, un nouveau marché. Quand une règle vit dans le code, chaque changement est une livraison, plusieurs services s'éloignent les uns des autres, et personne ne peut dire quelle version d'une règle a produit une décision prise au trimestre dernier.

Le dernier problème est le plus coûteux. Une décision qu'on ne peut pas reconstruire ne peut pas être expliquée, et une décision qu'on ne peut pas expliquer ne peut pas être défendue.

Stratégies de mise en œuvre valables

La forme est petite : l'application pose sa question à travers une interface qui lui appartient, l'interface consulte un matériau de politique versionné, et la décision qui revient porte la révision de ce matériau.

Architecture d'exemple · Non normative

Les règles comme données

Exemple d'architecture, non normatif : une application interroge une interface de politique, qui interroge un moteur ; le moteur lit un matériau de politique versionné et renvoie une réponse consignée avec sa révision.Une application envoie sa question, comme entrée, à une interface de politique qui appartient à l'application. L'interface interroge un moteur de politiques, qui ne change pas quand les règles changent. Le moteur lit le matériau de politique versionné, révision r, comme des données. La réponse du moteur est consignée dans un enregistrement de décision qui porte la réponse et la révision r.ApplicationInterfacede politique,appartenant àl'applicationMoteurde politiques,inchangé quandles règles changentMatériaude politique,données versionnées,révision rEnregistrementde décisionréponse et révision rentréelu comme donnéesréponse
  • Flux de données dans cet exemple
L'application interroge au travers d'une interface qui lui appartient. Le moteur ne change pas quand les règles changent ; le matériau est constitué de données versionnées, et chaque réponse est consignée avec la révision qui l'a produite.

Description textuelle. Une application envoie sa question, comme entrée, à une interface de politique qui appartient à l'application. L'interface interroge un moteur de politiques, qui ne change pas quand les règles changent. Le moteur lit le matériau de politique versionné, révision r, comme des données. La réponse du moteur est consignée dans un enregistrement de décision qui porte la réponse et la révision r.

  • Une interface de politique qui appartient à l'application. L'application pose une question dans ses propres termes, et le moteur se trouve derrière un adaptateur.
  • Un matériau de politique versionné. Les règles et leurs données sont des artefacts avec un identifiant par révision, déployés indépendamment de l'application.
  • La révision sur chaque décision. L'enregistrement de décision porte la réponse, la révision, et assez de l'entrée pour la rejouer.
  • Les anciennes révisions restent récupérables. Rejouer demande le matériau tel qu'il était, pas tel qu'il est.
  • Une évaluation reproductible. Une politique qui va chercher des données ou lit l'horloge pendant qu'elle évalue ne peut pas être rejouée à partir de sa seule entrée et de sa seule révision. Il faut transmettre ces faits comme entrée, et les consigner.
  • Le moteur versionné lui aussi. Une mise à jour du moteur peut changer le sens : OPA 1.0 a rendu obligatoires les mots-clés if et contains, par exemple. Consigner la version du moteur partout où le rejeu compte.
  • Une défaillance maîtrisée. Une révision inconnue, une révision manquante, une réponse mal formée ou un moteur injoignable produit une issue que le responsable de la règle a choisie à l'avance, jamais une valeur par défaut non consignée. Il n'existe pas de bonne réponse universelle : refuser l'action est juste pour une règle d'accès à une fonctionnalité comme celle de l'exemple du profil Python ; pour une autre décision, son responsable définit ce que signifie une défaillance, et consigne ce choix.

Options technologiques

Modes de défaillance

  1. Des règles dupliquées ou codées en dur dans plusieurs services

    Chaque copie change selon son propre calendrier, et la même requête est autorisée à un endroit et refusée à un autre.

  2. La révision non conservée avec le résultat

    La décision existe ; les règles qui l'ont produite, non.

  3. Un rechargement des règles change le sens de décisions historiques

    Un rapport recalcule les décisions du mois dernier avec les règles d'aujourd'hui et les présente comme celles du mois dernier.

  4. Des environnements qui exécutent des révisions différentes sans provenance

  5. Une ancienne décision ne peut pas être reconstruite

    Le matériau a été écrasé, ou l'évaluation dépendait de données récupérées au moment où elle s'est exécutée.

  6. L'indéfini lu comme une réponse

    En Rego, une règle dont l'entrée manque est indéfinie, et une valeur par défaut répond à sa place. Une clé d'entrée mal orthographiée retombe donc silencieusement sur la valeur par défaut, ce que les propres tests de l'exemple fixent. Un test de contrat du côté de l'appelant attrape la faute d'orthographe.

  7. Un cache de décisions qui ignore la révision

    Les réponses mises en cache à partir de l'ancien matériau survivent au déploiement du nouveau.

  8. Un moteur injoignable traité comme une permission

    Un client qui autorise quand le moteur ne répond pas transforme une panne en politique.

Vérification

  • Test unitaire

    Réussit quand : Les tests propres aux règles s'exécutent contre leur matériau : opa test exécute chaque règle préfixée par test_, et une table de règles a l'équivalent.

    Preuve de dents : Changer le matériau : les tests qui fixent les anciennes réponses échouent alors que la règle elle-même est inchangée.

  • Test d'intégration

    Réussit quand : Chaque décision consignée nomme une révision, égale à la révision du matériau chargé.

    Preuve de dents : Charger un matériau sans révision : le client refuse de consigner une décision.

  • Test d'intégration

    Réussit quand : La même entrée sous la même révision donne la même réponse, rejouée contre le matériau archivé.

  • Test de contrat

    Réussit quand : L'entrée que l'application envoie est l'entrée que la politique lit.

    Preuve de dents : Renommer un champ d'entrée d'un côté : le test de contrat échoue, au lieu que la politique retombe sur sa valeur par défaut.

  • Test de déploiement ou d'admission

    Réussit quand : Chaque environnement indique la révision qu'il exécute, et cette indication est comparée à l'enregistrement de livraison.

  • Preuve manuelle

    Réussit quand : Un échantillon de décisions historiques est rejoué contre les révisions qu'elles ont consignées.

Réalisations alternatives

  • Des règles dans le code, avec la révision du build consignée sur chaque décision. Praticable pour un petit système. Chaque changement de règle est alors une livraison, et le moteur change chaque fois qu'une règle change, ce que P-8 exclut.
  • Des services de feature flags. Proches des politiques, et souvent sans provenance des décisions : la configuration de flags qui a répondu à une requête donnée n'est souvent pas consignée.
  • Un service de décision détenu par une autre équipe, consommé via la même interface, avec la révision dans sa réponse.

Limites

  • Le pattern donne la provenance, pas la justesse. Une règle fausse bien versionnée reste fausse.
  • Il ne couvre pas les parties de P-8 que COADF ne publie pas, ni la façon dont une décision de politique rencontre un autre contrôle.
  • Open Policy Agent est un moteur d'exemple. Rien ici n'en fait une exigence.

Sources

COADF Engineering Companion 1.0 · non normatif · se rapporte à COADF Core 2.2

Droits de publication réservés. Aucune licence publique n'est accordée à ce jour pour le COADF Engineering Companion 1.0 ni pour ses exemples de référence.

Statut de propriété intellectuelle et de publication