Selección de Versión de Flujo Basada en el Contexto
A ContextBasedVersionSelector es un componente cuya única función es determinar qué versión de un flujo específico debe iniciarse cuando el llamante no especificó una versión en el InitiationInput.
En ese escenario, el código de manejo de entrada generado en su Domain llamará al configurado ContextBasedVersionSelector con el contexto propagado actual. Si el contexto propagado no ha sido establecido en la entrada de manera explícita, el contexto de ContextPropagation se utilizará para seleccionar la versión.
Si la versión seleccionada no puede resolverse a una versión de flujo concreta, se utilizará la última versión de flujo (la predeterminada cuando la selección de versión está deshabilitada).
Entre otras cosas, el ipf-write-starter-core el módulo viene empaquetado con una implementación predeterminada de ContextBasedVersionSelector.
Para utilizar el selector de versión predeterminado, simplemente conecte un ContextBasedVersionSelector bean como una dependencia en su Domain:
@Bean
public QuickStartModelDomain initialiseDomain(ActorSystem<?> actorSystem,
// the dependency on a bean provided by ipf-write-starter-core
ContextBasedVersionSelector versionSelector) {
return new QuickStartModelDomain. Builder(actorSystem)
.withVersionSelector(versionSelector)
.build();
}
Siga leyendo para aprender más sobre el selector de versión predeterminado y cómo configurarlo.
Descripción general del selector de versión predeterminado
Para ayudar a determinar la versión de un flujo a seleccionar, el selector de versión predeterminado se basa en un conjunto de reglas de enrutamiento proporcionadas a través de un almacén de reglas intercambiable.
Reglas de Selección de Versiones
Se proporciona una regla utilizando las siguientes tres piezas de información:
-
el
keyque debe estar presente en el contexto evaluado -
el
valueque la clave de contexto debe tener -
el
versionsi la clave con el valor dado
Las reglas en la tienda pueden definirse en dos niveles:
-
por un flujo específico, en cuyo caso se aplicarán solo al seleccionar versiones para ese flujo particular, o
-
globalmente, en cuyo caso se aplicarán a todos los flujos
Las reglas definidas en una base por flujo tienen prioridad sobre las reglas que se definen globalmente.
| Si bien las reglas de enrutamiento no le prohíben utilizar diferentes claves de contexto a nivel global y por flujo, utilizar la misma clave de contexto en todos los niveles resultará en reglas más mantenibles y menos propensas a errores. |
Reglas de Almacenamiento
Hay dos tipos de almacenes de reglas disponibles de forma predeterminada:
-
La tienda HOCON, habilitada por defecto, le permite especificar sus reglas de enrutamiento a través de propiedades de configuración y no permite ninguna modificación a las reglas después del inicio de la aplicación.
-
Almacenamiento de datos distribuido, que utiliza el Akka Datos Distribuidos biblioteca para almacenar y replicar las reglas en todos los nodos del clúster y persistirlas en disco. Las reglas pueden ser modificadas en cualquier momento y a través de un HTTP API. Al iniciar la aplicación, las reglas se cargan desde el disco y se establecerán por defecto en el HOCON reglas si no se pueden encontrar reglas en DData. El almacenamiento de datos distribuido se habilita configurando
ipf.behaviour.version-selection.route-store-type = ddata. Tenga en cuenta que hacerlo requerirá que añada lo siguiente JVM banderas a su comando de ejecución--add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMEDdebido a Akka el uso de LMDB para almacenamiento persistente (para más detalles consulte los documentos oficiales)== Configuración de las Reglas de Selección de Versiones
Reglas de Selección de Versión Predeterminada
La siguiente configuración de reglas se proporciona por defecto:
ipf.behaviour.version-selection {
// The global flow routing configuration to use when DData store is disabled or empty
global-rules = { (1)
// The defaults use the propagated `ipf_version_selection` key to drive version selection
key-name = ipf_version_selection (2)
version-rules = [{ (3)
active-from = "1970-01-01T00:00:00.00Z" (4)
// The default rules only allow you to pick the oldest or latest versions of flows
values-to-versions { (5)
OLDEST = OLDEST
LATEST = LATEST
STABLE = OLDEST
CANARY = LATEST
}
}]
}
// The per-flow routing configuration to use when DData store is disabled or empty
per-flow-rules { (6)
// Example structure your per-flow rule configuration should take:
//"Flow" = {
// key-name = ipf_version_selection
// version-rules = [{
// active-from = "1970-01-01T00:00:00.00Z"
// // The default rules only allow you to pick the oldest or latest versions of flows
// values-to-versions {
// VALUE1 = V1
// VALUE2 = V2
// }
// }]
//}
}
}
| 1 | El global-rules El bloque de configuración es efectivamente un bloque de reglas de clave de contexto único. |
| 2 | Una regla de clave de contexto se aplica a una única clave y sus posibles valores y el key-name La propiedad define el nombre de la clave de contexto que activa la regla.
Por defecto, las reglas globales proporcionan soporte solo para ipf_version_selection clave, que es una clave de contexto propagada a nivel de IPF.
Las claves de contexto propagadas serán detectadas automáticamente en transport message encabezados e incluidos en el contexto actual por receive connector s. |
| 3 | El version-rules el bloque proporciona una lista de mappings entre unos valores particulares el ipf_version_selection la clave de contexto puede tomar y la versión de flujo que deseamos seleccionar cuando ese valor se encuentra en el contexto evaluado. |
| 4 | Cada entrada en el version-rules lista de mappings debe tener una fecha de activación asignada — esto permite que se añadan reglas con fecha futura.
Cuando el mismo valor está presente en múltiples mapping entradas, la que tiene la más reciente active-from marca de tiempo gana. |
| 5 | La clave de contexto valor-versión mappings se definen dentro de un values-to-versions block.
Dado que las reglas globales son agnósticas al flujo, las versiones concretas del flujo generalmente estarán ausentes de ellas, pero OLDEST y LATEST se pueden utilizar versiones de marcador de posición.
Por defecto, cada vez que ipf_version_selection toma el valor de OLDEST or STABLE, se utilizará la versión de flujo más antigua de un flujo particular, mientras que LATEST y CANARY seleccionará la última versión de un flujo. |
| 6 | No se proporcionan reglas por flujo de forma predeterminada, pero puede deducir a partir de la configuración de ejemplo que las reglas por flujo utilizan la misma estructura de clave de contexto en la forma de "Flow" = <context-key-config-block>. |
Proporcionando Custom Reglas de Selección de Versiones
Hay dos maneras de customize sus reglas de selección de versión:
-
Al proporcionar sobreescrituras de configuración a través de
ipf.conf(o un.confarchivo más alto en la jerarquía). Las sobrecargas de configuración son la única manera de customize HOCON las reglas se almacenan y también son necesarias para customize los valores predeterminados para los almacenes de reglas de Datos Distribuidos. -
Al utilizar la selección de versión API para modificar la configuración. La versión API solo está disponible para los almacenes de reglas de Datos Distribuidos.
La API los detalles se cubren en el Documentación de la API página y el rest de esta sección se ocupará de HOCON only.
Apoyando a Custom Clave de contexto en reglas globales
Para apoyar su propio custom clave de contexto en lugar del valor predeterminado de IPF ipf_version_selection clave, simplemente sobrescriba todo el ipf.behaviour.version-selection.global-rules.key-name propiedad:
ipf.behaviour.version-selection.global-rules.key-name = my_custom_context_key
También deberá marcar el nuevo encabezado como propagado:
ipf.context-propagation.propagated-supporting-context-keys += my_custom_context_key
Anulando las Reglas Globales Predeterminadas
Para deshabilitar las reglas globales predeterminadas, simplemente proporcione un bloque de configuración vacío:
ipf.behaviour.version-selection.global-rules = {}
Para utilizar diferentes versiones de valor mappings en las reglas globales, simplemente sobrescriba el version-rules bloque con su propio mappings:
ipf.behaviour.version-selection.global-rules.version-rules = [{
active-from = "2024-01-01T00:00:00.00Z"
values-to-versions {
// new value mappings
MY_VALUE_1 = OLDEST
MY_VALUE_2 = LATEST
// keeps some of the old ones, too
STABLE = OLDEST
CANARY = LATEST
}
}]
Añadiendo Reglas por Flujo
ipf.behaviour.version-selection.per-flow-rules = { (1)
"Flow" = { (2)
key-name = ipf_version_selection (3)
version-rules = [{ (4)
active-from = "1970-01-01T00:00:00.00Z"
values-to-versions {
VALUE1 = V1 (5)
VALUE2 = V2
}
}]
}
}
| 1 | Usted añade sus reglas por flujo bajo el nombre apropiado ipf.behaviour.version-selection.per-flow-rules bloque de configuración. |
| 2 | El bloque de configuración consiste en un "<FlowName>" = <context-key-rule-block> pares clave-valor.
Un bloque de reglas de clave de contexto se aplica a una única clave. |
| 3 | Al igual que con las reglas globales, el key-name La propiedad define el nombre de la clave de contexto que activa la regla.
En este ejemplo estamos utilizando la misma clave que utilizamos para las reglas globales, que es el enfoque sugerido. |
| 4 | Nuevamente, exactamente como las reglas globales, el version-rules el bloque proporciona una lista de mappings entre unos valores particulares que la clave de contexto puede tomar y la versión del flujo que queremos seleccionar cuando ese valor se encuentra en el contexto evaluado. |
| 5 | A diferencia de las reglas globales, aquí se utilizan versiones de flujo concretas, pero esto no es sorprendente; poder seleccionar una versión específica de un flujo es la principal razón para especificar reglas por flujo. === Selección de versión API |