Archivado

Archivando paquetes y exportando datos de unidad de trabajo en un estándar IPF Processing Data sobre. Solo las unidades de trabajo que han alcanzado un estado terminal serán "archivadas".

Descripción general

El comportamiento de archivo se describe en el siguiente diagrama de secuencia.

Diagram

ODS Ingestionrealiza la selección de candidatos y publica esos candidatos en un ReadyForArchive notificación a un Kafka tema.

IPF Archiver consume las notificaciones, y para cada candidato dentro de ellas, 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 se identifican las unidades de trabajo como listas para ser archivadas. Se realiza por ODS Ingestion, y está deshabilitado por defecto.

Los candidatos son seleccionados cuando han alcanzado un estado terminal, 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 unidades de trabajo que han finalizado dentro de ese período. La ventana de selección es siempre una fecha y una hora, por ejemplo.{2023-12-18, 7} es una ventana en la 18 December 2023 con un rango de tiempo de [07:00.08:00).

El finishedAt la marca de tiempo de una unidad de trabajo 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 pasa 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 lapso de tiempo que la selección de candidatos esperará hasta que una unidad de trabajo sea 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).

candidate selection 1

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).

candidate selection 2

Una vez que todos los candidatos en la ventana de selección han sido seleccionados, la ventana se mueve a [11.12).

candidate selection 3

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.

candidate selection 4

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, las siguientes notificaciones podrían ser enviadas.

{
  "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

El estado de selección de candidatos se crea en la primera ejecución y se actualiza en cada ejecución subsiguiente.

El estado inicial podría parecerse a..

{
  "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 este estado, 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

IMPORTANTE

La siguiente configuración de selección de candidatos debe aplicarse a ODS Ingestion instancias de aplicació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

enabled

false

Permite la selección de candidatos, que está desactivada por defecto.

grace-period

2H

Un período de tiempo expresado en horas, por ejemplo.2H, o días, p. ej.365D.

fetch-size

1000

El número máximo de candidatos a seleccionar cada vez que se ejecute la selección de candidatos.

eligible-journey-types

[]

Define los tipos de unidad o trabajo que son elegibles para archivo. Por defecto, todos los tipos de unidad de trabajo serán archivados. Configurando con [PAYMENT] significaría solo unidad de trabajos con el tipo de viaje PAYMENT sería archivado.

Comportamiento de Ejecución Inicial

Todas las propiedades de configuración están precedidas por ipf.archiver.candidate-selection.initial-execution-behaviour.

Propiedad Predeterminado Descripción

window

UNDEFINED

Ya sea DATE, o LATEST. Si utiliza DATE,start-date debe ser definido. Si la selección de candidatos está habilitada y se ejecuta por primera vez cuando esta propiedad se deja como UNDEFINED, la selección de candidatos fracasará.

start-date

La fecha de inicio de la ventana de ejecución inicial, por ejemplo,2023-12-18.

Programador

Todas las propiedades de configuración están precedidas por ipf.archiver.candidate-selection.scheduler.

Propiedad Predeterminado Descripción

initial-delay

1M

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.

frequency

10s

Con qué frecuencia se ejecuta la selección de candidatos. Por defecto, es cada 10 segundos.

La configuración de los ajustes del supervisor de manejo de errores del programador se encuentra bajo ipf.archiver.candidate-selection.scheduler.restart-settings.

Propiedad Predeterminado Descripción

min-backoff

1s

max-backoff

1s

jitter-factor

0.2

Exportador de Selección de Candidatos

IMPORTANTE

La siguiente configuración del exportador de selección de candidatos debe aplicarse a ODS Ingestion instancias de aplicación.

ODS Ingestionproduce candidatos para archivar a Kafka.

Configuración del exportador de selección de candidatos predeterminada
ipf.archiver.candidate-selection {
  # Archiver connectors disabled by default
  enabled = false
  exporter {
    # Default resiliency settings applied to the exporter SendConnector
    resiliency {
      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
        }
      }
    }
  }
}

Agrupación de Archivos

Los paquetes de archivo se producen como IPF Processing Data sobres que contienen datos para una única unidad de trabajo. Los datos se construyen consultando el ODS base de datos directamente.

ODSconsume 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 la unidad de trabajo por defecto. Esto puede cambiarse configurando ipf.archiver.bundle.include-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 de Objeto Personalizado
{
"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"
}

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. Los datos que no pertenecen a una unidad de trabajo son ignorados.

Datos ODS ¿Incluido en el paquete? Notas

Message Log

Process Flow Event

MDS

Todas las versiones de todos MDS se incluyen objetos

PDS

Todas las versiones de todos PDS se incluyen objetos

Objeto Personalizado

Todo custom se incluyen objetos, así como un custom representación de objeto de la vista de resumen relacionada con la unidad de trabajo, si está habilitada.

System Event

no

Los eventos del sistema para una unidad de trabajo son ignorados.

Process Flow Definición

no

Process Flow Definitions no pertenecen a una unidad de trabajo

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, el Archiver puede egresar el evento del sistema opcional.ArchiveBundlingFailed a través de Kafka. Esto se realiza configurando lo siguiente para sus instancias de IPF Archiver:

ipf.system-events.exporter.type = ipf-processing-data-egress

Vea el System Event Exporter documentación para más detalles.

IPF Archiver

IPF Archiver es una aplicación ejecutable que consume ReadyForArchive notificaciones, y construye y exporta paquetes de archivo para cada candidato que contiene.

IPF Archiver debe ser implementado junto con un ODS Ingestion instancia. ODS Ingestionrealizará la selección de candidatos y enviará notificaciones.

Tanto IPF Archiver como ODS Ingestion compartirá una instancia de base de datos.

Selección de Candidatos Consumidor

Los candidatos para el archivo se consumen de Kafka.

Configuración

IMPORTANTE

La siguiente configuración de consumo de candidatos debe aplicarse a las instancias de la aplicación IPF Archiver.

Configuración del consumidor de selección de candidatos predeterminada
ipf.archiver.candidate-selection.consumer {
  # Default resiliency settings applied to the consumer ReceiveConnector
  resiliency {
    max-attempts = 30
  }
  kafka {
    # Kafka consumer config specifying topic, group id and restart-settings for the consumer KafkaReceiveConnectorTransport
    consumer {
      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 {
        group.id = ipf-achiver-candidate-consumer-group
      }
    }
  }
}

Exportador de Paquetes de Archivo

Los paquetes se exportan a Kafka.

Configuración

IMPORTANTE

Toda la configuración de agrupación de archivos debe aplicarse a las instancias de la aplicación IPF Archiver.

Configuración predeterminada del exportador de paquetes de archivo
ipf.archiver.bundle.exporter {
  # Default resiliency settings applied to the exporter SendConnector
  resiliency {
    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_BUNDLES
      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-bundle-exporter
        compression.type = gzip
      }
    }
  }
}

Consumo de Paquetes de Ipf Archiver

Para consumir los paquetes de archivo, usted deberá implementar com.iconsolutions.ipf.archiver.bundle. IpfArchiverBundleHandler y regístrelo como una Spring bean. Además, deberá depender del módulo 'ipf-archiver-bundle-consumer' que instancia un receive connector para el IPF_ARCHIVER_BUNDLES tema de kafka.

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 predeterminada del paquete de archivo para consumidores
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
      }
    }
  }
}