Mantenimiento de la Consistencia de Configuraciones a Través de Colecciones

En el Dynamic Processing Settings(DPS En el proyecto, hay situaciones en las que los cambios en la configuración deben actualizarse de manera transaccional o de forma coordinada en más de una colección de bases de datos. Por ejemplo:

  • Aprobaciones: Cuando se concede una aprobación para una operación de configuración pendiente (crear, actualizar o eliminar) y el approvals la colección se actualiza, el cambio correspondiente debe aplicarse a la colección de configuraciones asociada.

  • Historial de Configuración: Cuando se crea o modifica una configuración, el cambio debe ser registrado tanto en las configuraciones como en history colecciones.

Dado que algunas bases de datos tienen un soporte limitado para transacciones entre colecciones,DPS implementa un comportamiento de estilo transaccional al adoptar la Captura de Datos de Cambios (CDC) para capturar y propagar cambios a través de colecciones. Los detalles sobre cómo se logra esto se proporcionan en la siguiente sección.

Componentes y Configuración de CDC

Procesador de Cambios de DB Stream

El Procesador de Cambios de DB sirve como el componente principal de la implementación de CDC. Sus responsabilidades incluyen:

  1. Suscribiéndose a los cambios de la base de datos a través del componente DB Change Provider, utilizando uno de los mecanismos de suscripción soportados (actualmente, solo change-streams está disponible;`polling` está planificado para una futura versión).

  2. Reenviando los cambios de base de datos recuperados al procesador apropiado, el cual determina cómo manejar cada cambio. Dado que el mismo cambio de base de datos puede ser entregado a un procesador múltiples veces, los procesadores deben ser idempotentes.

  3. Rastreando el desplazamiento actual de los cambios procesados en la base de datos para minimizar el procesamiento duplicado.

La lista completa de propiedades de configuración disponibles para el componente DB Change Processor Stream, incluidos los valores predeterminados, se muestra a continuación:

ipf.dps.dbchange.processor.stream {
  # The number of DBChanges to demand from upstream and process in parallel
  # Suggested values are around 500 to 1000
  upstream-event-demand = 500

  restart-settings {
    # The starting backoff interval to use when restarting DBChange processor streams.
    min-backoff = 500 millis
    # The starting backoff interval to use when restarting DBChange processor streams.
    max-backoff = 20 seconds
    # The number of restarts is capped within a timeframe of max-restarts-within.
    max-restarts = 86400000
    # The number of restarts is capped to max-restarts within a timeframe of within.
    max-restarts-within = 1 days
    # The starting backoff interval to use when restarting DBChange processor streams.
    jitter = 0.1
  }

  # To improve throughput, offsets of successfully processed DBChanges are
  # not checkpointed for each DBChange but are instead grouped together in
  # size and time based windows, with the last DBChange offset in a particular
  # window used as a checkpoint.
  # The window completes when it reaches the specified `size` of offsets,
  # or when the `timeout` duration passes (whichever comes first).
  commit-offset-window {
    # The size of the window.
    size = 1000
    # The amount of time to wait for `size` DBChanges to complete.
    timeout = 1 minute
  }

  # Requests to DBChangeProcessor implementations will be retried on exception based on the below config.
  # Once all retries have been exhausted, the DBChange will get sent to a dead letter appender
  resiliency-settings {
    # Max number of attempts to retry DbChangeProcessor in case of failure
    max-attempts = 3
    # Retry wait period between retries
    initial-retry-wait-duration = 1s
    # Backoff multiplier between retires
    backoff-multiplier = 2
    # Thread pool size for retries executor service
    retry-scheduler-thread-pool-size = 1
    # In the case of the dead letter itself failing we have more recovery options to try:
    # * COMMIT - Commit the offset
    # * NO_COMMIT - Do not commit the offset and retry the DBChange
    deadletter-failure-strategy = NO_COMMIT
  }
}

Proveedor de Cambio de DB

El componente Proveedor de Cambios de Base de Datos entrega un flujo de cambios de base de datos al Procesador de Cambios de Base de Datos, utilizando ya sea flujos de cambios o mecanismos de sondeo.

Flujos de Cambio

Los flujos de cambios sirven como el método predeterminado para capturar y suscribirse a los cambios en la base de datos como parte de la implementación de CDC. Esto permite la supervisión en tiempo real de las colecciones, lo que permite que el Procesador de Cambios de la Base de Datos consuma y procese los cambios tan pronto como ocurren.

Encuesta

La votación no está disponible aún; se planea el soporte para una futura versión.

La lista completa de propiedades de configuración disponibles para el componente DB Change Provider, incluidos los valores predeterminados, se muestra a continuación. Tenga en cuenta que la selección de la implementación de suscripción se realiza utilizando el ipf.dps.dbchange.subscription propiedad:

ipf.dps.dbchange {
  # DbChangeProvider implementation
  # * change-streams - recomended option
  # * polling - TODO: not supported yet
  subscription = "change-streams"

  # Buffer period when resuming change streams to help prevent data loss
  # caused by timing delays or race conditions.
  # Note: The DbChangeProvider is likely to emit more
  # dbChange duplicates as the allowed-time-drift value increases.
  allowed-time-drift = 2s

  # Larger values reduce the number of getMore operations
  # to fetch additional batches but increase the duration of each operation.
  collection-batch-size = 100

  # Interval to wait between polls to check if
  # the specified collection is available
  # (typically after it has previously been dropped).
  collection-available-polling-interval = 10s

  # Maximum time to wait for the specified collection to become available
  # (typically after it has previously been dropped).
  collection-available-max-wait-time = 5m
}