Archivado
Archivado de paquetes y exportaciones unit of work datos en un estándar IPF Processing Data sobre. Solo unit of work s que han alcanzado un terminal state será "archivado".
Descripción general
El comportamiento de archivo se describe en el siguiente diagrama de secuencia.
ODS Ingestion realiza la selección de candidatos y publica esos candidatos en un `ReadyForArchive` notificación a un Kafka tema.
IPF Archiver consume el notifications, y para cada candidato dentro, obtiene todos sus datos y produce un paquete de archivo, que se publica en Kafka.
Selección de Candidatos
La selección de candidatos es donde unit of work s están identificados como listos para archivar. Se realiza por ODS Ingestion, y está deshabilitado por defecto.
Los candidatos son seleccionados cuando han alcanzado un terminal state, por ejemplo, tienen un finishedAt marca de tiempo, y que esa marca de tiempo se encuentra dentro de la ventana de selección de una hora actual.
Ventana de Selección
La ventana de selección es un período de una hora.
Se realizan consultas para unit of work s que han finalizado dentro de esa ventana.
La ventana de selección es siempre una fecha y una hora, por ejemplo.{2023-12-18, 7} es una ventana en el 18 December 2023 con un rango de tiempo de [07:00. 08:00).
El finishedAt marca de tiempo de un unit of work debe satisfacer {finishedAt | lowerBound ⇐ finishedAt < upperBound} para ser elegible para la selección de candidatos.
Cuando todos los candidatos han sido seleccionados de una ventana, se mueve a la siguiente ventana, por ejemplo.{2023-12-18, 8}, entonces {2023-12-18, 9}, y así sucesivamente.
Al final del día, p. ej.{2023-12-18, 23}, la siguiente ventana es {2023-12-19, 0}.
El finishedAt la marca de tiempo y las consultas de la ventana de selección siempre están en UTC, por ejemplo, una ventana de selección de {2023-12-18, 9} tiene un límite inferior de 2023-12-18T09:00:00Z, y un límite superior de 2023-12-18T09:59:59. 999999999Z.
Período de gracia
El período de gracia es un período de tiempo que la selección de candidatos esperará hasta que un unit of work es elegible para archivo. Debe expresarse en horas o días, y el período de gracia más pequeño es de 1 hora.
El inicio del período de gracia se calcula restando el período de gracia de la hora actual.
por ejemplo, actualmente 2023-12-18T13:49:21Z, y el período de gracia es de una hora.
El límite inferior del período de gracia es la hora actual de 13, menos el período de gracia de 1 hora, lo que resulta en 2023-12-18T12:00:00Z.
Debido a que se ignoran los minutos y segundos, el período de gracia suele ser mayor que el período configurado, hasta 00:59:59. 999999 más.
Comportamiento de Selección Inicial
Cuando la selección de candidatos se ejecute por primera vez, debe indicarle desde dónde comenzar, por ejemplo, la primera ventana. Si esto no está configurado explícitamente, se registrará una advertencia y la selección de candidatos fallará.
Una vez que la selección de candidatos se haya ejecutado con éxito al menos una vez, esta configuración no tendrá efecto.
Fecha
La ventana inicial puede ser una fecha de inicio configurada, que siempre es al comienzo de ese día, por ejemplo, una fecha de 2023-12-01 resulta en una ventana inicial de {2023-12-01, 0}.
Último
Toma la fecha y hora actuales, resta el período de gracia y comienza a la hora anterior a esa.
Si actualmente es 2023-12-18T13:49:21Z, la hora actual es 13. Reste el período de gracia, por ejemplo, 1 hora, lo que resulta en 12, y comience desde la hora anterior a esa, 11. La ventana inicial es {2023-12-18, 11}.
Visualización
Dado que la hora actual es 15:15, el período de gracia es 4-hours, o [11:00. 15:15], y la ventana de selección actual es [9. 10).
Una vez que todos los candidatos en la ventana de selección han sido seleccionados, lo cual puede ser en una única consulta o en muchas consultas más pequeñas, la ventana se mueve a [10. 11).
Una vez que todos los candidatos en la ventana de selección han sido seleccionados, la ventana se mueve a [11. 12).
Esta ventana de selección se encuentra ahora dentro del período de gracia. No se seleccionan candidatos hasta que el tiempo avanza, de tal manera que la ventana de selección esté fuera del período de gracia.
Cuando la hora actual llegue a 16:00, el período de gracia se convierte en [12:00. 16:00], y la ventana de selección [11:00. 12:00) se vuelve elegible.
Los candidatos dentro de esta ventana serán seleccionados ahora.
Listo para archivar Notifications
Los candidatos que son seleccionados para archivo se publican en un ReadyForArchive notificación, que contiene los candidatos seleccionados, la ventana en la que fueron seleccionados y su número de secuencia dentro de la ventana de selección actual.
Cada notificación indicará si es la última notificación para la ventana actual.
Ejemplos
Si hay tres candidatos para la hora 12, y el tamaño de recuperación es 2, lo siguiente notifications podría ser enviado.
{
"candidates": ["unit-of-work-1", "unit-of-work-2"],
"window": {
"date": "2023-12-18",
"hour": 12,
"notificationSequence": 1
},
"lastNotificationInWindow": false
}
{
"candidates": ["unit-of-work-3"],
"window": {
"date": "2023-12-18",
"hour": 12,
"notificationSequence": 2
},
"lastNotificationInWindow": true
}
Si no hay candidatos para la hora 13, se enviaría la siguiente notificación.
{
"candidates": [],
"window": {
"date": "2023-12-18",
"hour": 13,
"notificationSequence": 1
},
"lastNotificationInWindow": true
}
State
Selección de candidatos state se crea en la primera ejecución y se actualiza en cada ejecución subsiguiente.
La inicial state podría verse algo como..
{
"date": "2023-12-18",
"hour": "12",
"checkpoint": null,
"notificationSequence": 1
}
La fecha y la hora representan la ventana de selección actual.
El punto de control es el último candidato que vimos dentro de la ventana.
La secuencia de notificación es un número que se incrementa en cada ejecución hasta que se avanza la ventana, momento en el cual vuelve a ser 1.
Cuando se seleccionan candidatos para esto state, se actualiza.
{
"date": "2023-12-18",
"hour": "12",
"checkpoint": "unit-of-work-6",
"notificationSequence": 2
}
Si no hay más candidatos en la ventana, pasamos a la siguiente ventana.
{
"date": "2023-12-18",
"hour": "13",
"checkpoint": null,
"notificationSequence": 1
}
Configuración
La selección de candidatos se ejecuta con frecuencia y selecciona un número máximo de candidatos en cada ejecución. Puede controlar el rendimiento de la selección de candidatos configurando tanto la frecuencia de ejecución como el tamaño de recuperación para cada ejecución.
Todas las propiedades de configuración están precedidas por ipf.archiver.candidate-selection.
Configuración de Selección de Candidatos por Defecto
ipf {
archiver {
candidate-selection {
enabled = false
# Define what should happen when candidate selection is executed for the first time
initial-execution-behaviour {
# Define the initial window for candidate selection, e.g. the time period in which to search for finished unit of works.
# LATEST = The latest window given the current datetime and the grace period
# DATE = Define a specific date with a `start-date` property, e.g. `start-date = 2023-11-01`
# UNDEFINED = The default. Candidate selection will fail if this property is used on the first execution
window = UNDEFINED
# An example start-date when a specific date is used (window = DATE) for the initial window
# start-date = 2023-11-01
}
# Minimum time to wait before selecting a candidate unit of work once it has reached a terminal state
grace-period = 2H
# How many archive candidates to fetch on each invocation of the scheduler (see scheduler config below)
fetch-size = 1000
# Journey types to select for archive. If null or empty, then any journey type will be archived
eligible-journey-types = []
scheduler {
# How long to wait once ODS has started before checking for archive candidates
initial-delay = 1M
# How often to check for archive candidates, fetching `fetch-size` candidates each time. See `fetch-size` above.
frequency = 10s
restart-settings {
min-backoff = 1s
max-backoff = 1s
jitter-factor = 0. 2
}
}
}
}
}
| Propiedad | Predeterminado | Descripción |
|---|---|---|
|
|
Permite la selección de candidatos, que está desactivada por defecto. |
|
|
Un período de tiempo expresado en horas, por ejemplo. |
|
|
El número máximo de candidatos a seleccionar cada vez que se ejecute la selección de candidatos. |
|
|
Define los tipos de unidad o trabajo que son elegibles para archivo. Por defecto, todos unit of work los tipos serán archivados. Configurando con |
Comportamiento Inicial de Ejecución
Todas las propiedades de configuración están precedidas por ipf.archiver.candidate-selection.initial-execution-behaviour.
| Propiedad | Predeterminado | Descripción |
|---|---|---|
|
|
O bien |
|
La fecha de inicio de la ventana de ejecución inicial, por ejemplo, |
Scheduler
Todas las propiedades de configuración están precedidas por ipf.archiver.candidate-selection.scheduler.
| Propiedad | Predeterminado | Descripción |
|---|---|---|
|
|
El período de tiempo que debe esperar una vez que la aplicación ha comenzado antes de comenzar a buscar candidatos para el archivo. Por defecto, espera 1 minuto. |
|
|
Con qué frecuencia se ejecuta la selección de candidatos. Por defecto, es cada 10 segundos. |
Scheduler la configuración del supervisor de manejo de errores se encuentra bajo `ipf.archiver.candidate-selection.scheduler.restart-settings`.
| Propiedad | Predeterminado | Descripción |
|---|---|---|
|
|
|
|
|
|
|
|
Agrupación de Archivos
Los paquetes de archivo se producen como IPF Processing Data sobres que contienen datos para un solo unit of work. Los datos se construyen consultando el ODS base de datos directamente.
ODS consume IPF Processing Data sobres, y transforma y persiste en su propio modelo de datos. La archivación toma el ODS modelo y se transforma de nuevo en el IPF Processing Data modelo.
Los paquetes de archivo se producen en IPF Processing Data esquema V2 por defecto.
Los paquetes de archivo también se producen sin una vista de resumen relacionada con el unit of work por defecto. Esto puede ser cambiado configurando ipf.archiver.bundle.includes-summary = true esto incluirá la vista resumen en un custom representación de objeto.
A continuación se presenta una representación de la custom objeto que contiene la vista de resumen. Mientras que la vista de resumen es una cadena, puede ser deserializada en un objeto desde el ODS Inquiry API specification. El exacto ODS Inquiry el objeto de esquema se definirá en el key campo. En el ejemplo a continuación, el ODS Inquiry el objeto de esquema utilizado es el SummaryView.
Ejemplo de Resumen Custom Objeto
{
"key": "SummaryView",
"value": "{\"class\":\"SummaryView\",\"createdAt\":\"2023-12-04T11:00:00Z\",\"unitOfWorkId\":\"unit-of-work-3\",\"terminal\":false,\"failure\":false,\"clientRequestId\":\"KNOWN\",\"processingEntity\":\"processing-entity-3\"}",
"uniqueId": "a91e3f60-0da6-49e8-bdec-958c51218bb9",
"createdAt": "2025-03-14T15:08:31. 440Z"
}
Manejo de Errores
Cualquier error generado durante la agrupación de archivos se registra como un error sin que se tome ninguna acción. Sin embargo, hay una opción adicional system event de tipo ArchiveBundlingFailed, se le requerirá configurar ipf.procesamiento-datos-salida.
Datos
No todos los datos recibidos por ODS lo incluye en el paquete de archivo. En algunos casos, los datos se ignoran completamente; en otros casos, solo se incluye la última versión de un objeto particular. Datos que no pertenecen a un unit of work is ignored.
| Datos ODS | ¿Incluido en el paquete? | Notas |
|---|---|---|
Message Log |
sí |
|
Process Flow Event |
sí |
|
MDS |
sí |
Todas las versiones de todos MDS se incluyen objetos |
PDS |
sí |
Todas las versiones de todos PDS se incluyen objetos |
Custom Objeto |
sí |
Todo custom se incluyen objetos, así como un custom representación de objeto de la vista resumen relacionada con el unit of work, si está habilitado. |
System Event |
no |
System events para un unit of work are ignored. |
Process Flow Definición |
no |
Process Flow Definitions no pertenecen a un unit of work |
Exportar
Los paquetes se exportan a Kafka.
Configuración
Configuración del Exportador de Notificaciones ReadyForArchive por Defecto
ipf.archiver.candidate-selection {
# Archiver connectors disabled by default
enabled = false
exporter {
# Default resiliency settings applied to the exporter SendConnector
max-attempts = 5
minimum-number-of-calls = 10
initial-retry-wait-duration = 1s
kafka {
# Kafka producer config specifying topic, client id and restart-settings for the exporter KafkaConnectorTransport
producer {
topic = IPF_ARCHIVER_CANDIDATES
restart-settings = {
min-backoff = 1s
max-backoff = 5s
random-factor = 0. 25
max-restarts = 5
max-restarts-within = 10m
}
kafka-clients {
client.id = ipf-achiver-candidate-exporter-client
}
}
}
}
}
# Configure to false if summaries are not being used in ODS Ingestion
ods.summary.enabled = true
| Deshabilitar ods.summary.enabled si ODS Ingestion la instancia no produce ningún documento de resumen. |
IPF Archiver
IPF Archiver es una aplicación ejecutable que consume ReadyForArchive notifications, y construye y exporta paquetes de archivo para cada candidato que contiene.
El Archiver IPF debe ser implementado junto con un ODS Ingestion instancia. ODS Ingestion realizará la selección de candidatos y enviará notifications.
Tanto IPF Archiver como ODS Ingestion compartirá una instancia de base de datos.
Consumiendo Paquetes de Ipf Archiver
Para consumir los paquetes de archivo, usted deberá implementar com.iconsolutions.ipf.archiver.bundle. IpfArchiverBundleHandler y regístrelo como un spring bean. Además, deberá depender del módulo 'ipf-archiver-bundle-consumer' que instancia un receive connector para el IPF_ARCHIVER_BUNDLES kafka tema.
ipf-archiver-bundler-api`proporciona el `IpfArchiverBundleHandler interfaz:
<dependency>
<groupId>com.iconsolutions.ipf.archiver</groupId>
<artifactId>ipf-archiver-bundler-api</artifactId>
</dependency>
ipf-archiver-bundler-consumer provides a predefined receive connector for the IPF_ARCHIVER_BUNDLES kafka topic. This connector uses IpfArchiverBundleHandler to handle the received bundles:
This dependency will also pull in ipf-archiver-bundler-api as a transitive dependency
|
<dependency>
<groupId>com.iconsolutions.ipf.archiver</groupId>
<artifactId>ipf-archiver-bundler-consumer</artifactId>
</dependency>
Configuración
Configuración de Consumidor del Paquete Predeterminado
ipf.archiver.bundle.consumer {
resiliency {
max-attempts = 30
}
kafka {
# Kafka consumer config specifying topic, group id and restart-settings for the consumer KafkaReceiveConnectorTransport
consumer {
topic = IPF_ARCHIVER_BUNDLES
restart-settings = {
min-backoff = 1s
max-backoff = 5s
random-factor = 0. 25
max-restarts = 5
max-restarts-within = 10m
}
kafka-clients {
group.id = ipf-achiver-bundle-consumer-group
}
}
}
}