Ir al contenido

Proyecto independiente de I+D · Colonia

Reglas como datos

Las reglas de decisión se versionan con independencia del código de la aplicación, y cada decisión conserva la procedencia de la versión de las reglas que la produjo.

No normativo

Versión del Companion
1.0
Corresponde a COADF Core
2.2
Estado
Vigente
Última revisión
Principios de COADF
P-8

Propiedad de arquitectura

COADF P-8, tal como se publica: las reglas contra las que se mide una decisión son datos, el motor que las evalúa no cambia cuando cambia una regla, y un registro de decisión queda atado a la versión del conjunto de reglas que lo produjo, lo que extiende la traza de P-4 hasta la procedencia de las reglas. COADF nombra él mismo el estado de la técnica: ya existen conjuntos de reglas que pueden recargarse, con registros de decisión vinculados a su versión, y Open Policy Agent es el ejemplo evidente.

COADF retiene una parte de P-8, y lo dice en su página de principios. Nada en esta página describe esa parte. Los ejemplos usan un tema deliberadamente genérico: qué funcionalidades puede activar un entorno de despliegue.

Por qué importa

Las reglas cambian más a menudo que el código, y por razones distintas: la orientación de un regulador, un contrato, un mercado nuevo. Cuando una regla vive en el código, cada cambio es una entrega, varios servicios se van separando y nadie puede decir qué versión de una regla produjo una decisión tomada el trimestre pasado.

El último problema es el caro. Una decisión que no puede reconstruirse no puede explicarse, y una decisión que no puede explicarse no puede defenderse.

Estrategias de implementación válidas

La forma es pequeña: la aplicación pregunta a través de una interfaz que le pertenece, la interfaz consulta material de políticas versionado, y la decisión que vuelve lleva la versión de ese material.

Arquitectura de ejemplo · No normativa

Política como datos

Arquitectura de ejemplo, no normativa: una aplicación consulta una interfaz de política, que consulta un motor; el motor lee material de política versionado y devuelve una respuesta que se registra con su revisión.Una aplicación envía su pregunta, como entrada, a una interfaz de política que pertenece a la aplicación. La interfaz consulta un motor de política, que no cambia cuando cambian las reglas. El motor lee material de política versionado, revisión r, como datos. La respuesta del motor se registra como un registro de decisión que lleva la respuesta y la revisión r.AplicaciónInterfaz de políticapropiedad de laaplicaciónMotor de políticano cambia cuandocambian las reglasMaterial de políticadatos versionados,revisión rRegistro de decisiónrespuesta yrevisión rentradaleído como datosrespuesta
  • Flujo de datos en este ejemplo
La aplicación pregunta a través de una interfaz que le pertenece. El motor no cambia cuando cambian las reglas; el material son datos versionados, y cada respuesta se registra con la revisión que la produjo.

Descripción textual. Una aplicación envía su pregunta, como entrada, a una interfaz de política que pertenece a la aplicación. La interfaz consulta un motor de política, que no cambia cuando cambian las reglas. El motor lee material de política versionado, revisión r, como datos. La respuesta del motor se registra como un registro de decisión que lleva la respuesta y la revisión r.

  • Una interfaz de políticas que pertenece a la aplicación. La aplicación hace una pregunta en sus propios términos, y el motor queda detrás de un adaptador.
  • Material de políticas versionado. Las reglas y sus datos son artefactos con un identificador por versión, desplegados con independencia de la aplicación.
  • La versión en cada decisión. El registro de decisión lleva la respuesta, la versión y lo suficiente de la entrada para reproducirla.
  • Las versiones antiguas, recuperables. Una reproducción necesita el material tal como era, no tal como es.
  • Evaluación reproducible. Una política que obtiene datos o lee el reloj mientras se evalúa no puede reproducirse solo a partir de su entrada y su versión. Esos hechos se pasan como entrada, y se registran.
  • También el motor versionado. Una actualización del motor puede cambiar el significado: OPA 1.0 hizo obligatorias las palabras clave if y contains, por ejemplo. Se registra la versión del motor allí donde importe la reproducción.
  • Fallo controlado. Una versión desconocida, una versión ausente, una respuesta mal formada o un motor inalcanzable producen un resultado que quien es responsable de la regla eligió de antemano, nunca un valor por defecto sin registrar. No hay una respuesta correcta universal: rechazar la acción es lo correcto para una regla de acceso a funcionalidades como la del ejemplo del perfil de Python; para otra decisión, quien es responsable de ella define qué significa el fallo, y registra la elección.

Opciones tecnológicas

Modos de fallo

  1. Reglas duplicadas o fijadas en el código de varios servicios

    Cada copia se cambia según su propio calendario, y la misma petición se permite en un sitio y se rechaza en otro.

  2. La versión no se conserva con el resultado

    La decisión existe; qué reglas la produjeron, no.

  3. Una recarga de reglas cambia el significado de decisiones históricas

    Un informe recalcula las decisiones del mes pasado con las reglas de hoy y las presenta como las del mes pasado.

  4. Entornos que ejecutan versiones distintas sin procedencia

  5. Una decisión antigua no puede reconstruirse

    El material se sobrescribió, o la evaluación dependía de datos obtenidos en el momento en que se ejecutó.

  6. Lo indefinido leído como respuesta

    En Rego, una regla cuya entrada falta queda indefinida, y responde en su lugar un valor por defecto. Una clave de entrada mal escrita cae así en silencio al valor por defecto, algo que fijan las propias pruebas del ejemplo. Una prueba de contrato del lado de quien llama detecta la errata.

  7. Una caché de decisiones que ignora la versión

    Las respuestas almacenadas en caché con el material antiguo sobreviven al despliegue del nuevo.

  8. Un motor inalcanzable tratado como permiso

    Un cliente que permite cuando el motor no responde convierte una caída en una política.

Verificación

  • Prueba unitaria

    Pasa cuando: Las pruebas propias de las reglas se ejecutan contra su material: opa test ejecuta cada regla con el prefijo test_, y una tabla de reglas tiene el equivalente.

    Prueba de dientes: Se cambia el material: las pruebas que fijan las respuestas antiguas fallan mientras la regla misma no cambia.

  • Prueba de integración

    Pasa cuando: Cada decisión registrada nombra una versión, igual a la versión del material cargado.

    Prueba de dientes: Se carga material sin versión: el cliente se niega a registrar una decisión.

  • Prueba de integración

    Pasa cuando: La misma entrada con la misma versión da la misma respuesta, reproducida contra el material archivado.

  • Prueba de contrato

    Pasa cuando: La entrada que envía la aplicación es la entrada que lee la política.

    Prueba de dientes: Se renombra un campo de entrada en un lado: la prueba de contrato falla, en lugar de que la política caiga en su valor por defecto.

  • Prueba de despliegue o de admisión

    Pasa cuando: Cada entorno informa la versión que ejecuta, y el informe se compara con el registro de la entrega.

  • Evidencia manual

    Pasa cuando: Una muestra de decisiones históricas se reproduce contra las versiones que registraron.

Realizaciones alternativas

  • Reglas en el código, con la versión de compilación registrada en cada decisión. Viable para un sistema pequeño. Cada cambio de regla es entonces una entrega, y el motor cambia cada vez que cambia una regla, algo que P-8 excluye.
  • Servicios de feature flags. Parecidos a las políticas, y a menudo sin procedencia de las decisiones: con frecuencia no se registra qué configuración de flags respondió a una petición concreta.
  • Un servicio de decisiones de otro equipo, consumido a través de la misma interfaz, con la versión en su respuesta.

Limitaciones

  • El patrón da procedencia, no corrección. Una regla errónea bien versionada sigue siendo errónea.
  • No cubre las partes de P-8 que COADF no publica, ni cómo una decisión de política se encuentra con cualquier otro control.
  • Open Policy Agent es un motor de ejemplo. Nada de lo que aquí figura lo convierte en requisito.

Fuentes

COADF Engineering Companion 1.0 · no normativo · corresponde a COADF Core 2.2

Derechos de publicación reservados. Por ahora no se concede ninguna licencia pública para el COADF Engineering Companion 1.0 ni para sus ejemplos de referencia.

Estado de propiedad intelectual y de publicación