Compatibilidad con la fuente de cambios en Azure Blob Storage

El propósito de la fuente de cambios es proporcionar registros de transacciones de todos los cambios que se producen en los blobs y en los metadatos de blobs de la cuenta de almacenamiento. La fuente de cambios proporciona un registro ordenado, garantizado, durable, inmutable y de solo lectura de estos cambios. Las aplicaciones cliente pueden leer estos registros en cualquier momento, ya sea en streaming o en modo por lotes. Cada cambio genera exactamente una entrada del registro de transacciones, por lo que no tendrá que administrar varias entradas de registro para el mismo cambio. La fuente de cambios le permite compilar soluciones eficaces y escalables que procesan los eventos de cambio que se producen en su cuenta de Blob Storage a un bajo costo.

Para obtener información sobre cómo procesar registros en la fuente de cambios, consulte Procesamiento de la fuente de cambios en Azure Blob Storage.

Funcionamiento de la fuente de cambios

La fuente de cambios se almacena como blobs en un contenedor especial de la cuenta de almacenamiento al costo de los precios de los blobs estándar. Puede controlar el período de retención de estos archivos en función de los requisitos (consulte las condiciones de la versión actual). Los eventos de cambio se anexan a la fuente de cambios como registros en la especificación de formato de Apache Avro: un formato compacto, rápido y binario que proporciona estructuras de datos enriquecidos con el esquema en línea. Este formato se usa ampliamente en el ecosistema de Hadoop, en Stream Analytics y en Azure Data Factory.

Puede procesar estos registros de manera asincrónica, incremental o en su totalidad. Cualquier número de aplicaciones cliente puede leer de manera independiente la fuente de cambios, en paralelo y a su propio ritmo. Las aplicaciones de análisis como Apache Drill o Apache Spark pueden consumir registros directamente como archivos Avro, lo que le permite procesarlos a un bajo costo, con un alto ancho de banda y sin la necesidad de escribir una aplicación personalizada.

En el diagrama siguiente se muestra cómo se agregan registros a la fuente de cambios:

Diagrama que muestra cómo funciona la fuente de cambios para ofrecer un registro ordenado de los cambios en los blobs

La compatibilidad con la fuente de cambios es adecuada para escenarios que procesan datos en función de los objetos que han cambiado. Por ejemplo, las aplicaciones pueden:

  • Actualizar un índice secundario, sincronizar con una caché, un motor de búsqueda o cualquier otro escenario de administración de contenido.
  • Extraer métricas e información de análisis de negocios, en función de los cambios que se produzcan en los objetos, ya sea como transmisión o en modo por lotes.
  • Almacenar, auditar y analizar cambios en los objetos, en cualquier período de tiempo, por seguridad, cumplimiento normativo o inteligencia en la administración de datos empresariales.
  • Compilar soluciones para la copia de seguridad, el reflejo o la replicación del estado de los objetos en su cuenta para la administración ante desastres o el cumplimiento.
  • Crear canalizaciones de aplicaciones conectadas que reaccionen a eventos de cambio o programen ejecuciones basadas en objetos creados o modificados.

La fuente de cambios es un requisito previo para Replicación de objetos y Restauración a un momento dado para blobs en bloques.

Nota:

La fuente de cambios proporciona un modelo de registro duradero y ordenado de los cambios que se producen en un blob. Los cambios se escriben y pasan a estar disponibles en el registro de la fuente de cambios en cuestión de minutos después del cambio. Si es necesario que su aplicación reaccione a eventos mucho más rápido, considere la posibilidad de usar en su lugar los eventos de Blob Storage. Los eventos de Blob Storage proporcionan eventos únicos en tiempo real que permiten a Azure Functions o a sus aplicaciones reaccionar rápidamente a los cambios que se producen en un blob.

Habilitar y deshabilitar la fuente de cambios

Para iniciar la captura y registro de cambios debe habilitar la fuente de cambios en la cuenta de almacenamiento. Deshabilite la fuente de cambios para detener la captura de cambios. Puede habilitar y deshabilitar los cambios mediante el uso de plantillas de Azure Resource Manager en Azure Portal o PowerShell.

Estos son algunos aspectos que hay que tener en cuenta al habilitar la fuente de cambios.

  • Solo hay una fuente de cambios para Blob service en cada cuenta de almacenamiento. Los registros de fuente de cambios se almacenan en el contenedor $blobchangefeed.

  • Los cambios de creación, actualización y eliminación se capturan solo en el nivel de Blob service.

  • La fuente de cambios captura todos los cambios de todos los eventos disponibles que se producen en la cuenta. Las aplicaciones cliente pueden filtrar los tipos de eventos según sea necesario. (Consulte las condiciones de la versión actual).

  • Solo las cuentas de uso general v2 estándar, de blobs en bloques prémium y de Blob Storage pueden habilitar la fuente de cambios. Las cuentas con un espacio de nombres jerárquico habilitado no se admiten actualmente. No se admiten las cuentas de uso general v1, pero se pueden actualizar a v2 sin tiempo de inactividad. Para más información consulte Actualización a una cuenta de almacenamiento de uso general v2.

Habilite la fuente de cambios en la cuenta de almacenamiento mediante Azure Portal:

  1. En Azure Portal, seleccione la cuenta de almacenamiento.

  2. Vaya a la opción Protección de datos en Administración de datos.

  3. En Seguimiento, seleccione Habilitar la fuente de cambios del blob.

  4. Elija el botón Guardar para confirmar la configuración de protección de datos.

    Captura de pantalla que muestra cómo habilitar la fuente de cambios en Azure Portal

Uso de la fuente de cambios

La fuente de cambios genera varios archivos de registro y metadatos. Estos archivos se ubican en el contenedor $blobchangefeed de la cuenta de almacenamiento. El contenedor $blobchangefeed se puede ver mediante Azure Portal o el Explorador de Azure Storage.

Las aplicaciones cliente pueden usar la fuente de cambios mediante la biblioteca de procesadores de fuente de cambios de blobs que se proporciona con el SDK del procesador correspondiente. Para obtener información sobre cómo procesar registros en la fuente de cambios, consulte Procesamiento de los registros de la fuente de cambios en Azure Blob Storage.

Segmentos de fuente de cambios

La fuente de cambios es un registro de los cambios que se organizan en segmentos horarios, pero que se anexan y se actualizan cada pocos minutos. Estos segmentos se crean solo cuando se produce un evento de cambio de blob en esa hora. Esto permite que la aplicación cliente consuma los cambios que se producen dentro de intervalos de tiempo específicos sin tener que buscar en todo el registro. Para más información, consulte las especificaciones.

Un segmento por hora disponible de la fuente de cambios se describe en un archivo de manifiesto que especifica las rutas de acceso a los archivos de la fuente de cambios para ese segmento. El listado del directorio virtual $blobchangefeed/idx/segments/ muestra estos segmentos ordenados por hora. La ruta de acceso del segmento describe el inicio del intervalo de tiempo por hora que el segmento representa. Puede usar esa lista para filtrar los segmentos de registros que le interesen.

Name                                                                    Blob Type    Blob Tier      Length  Content Type    
----------------------------------------------------------------------  -----------  -----------  --------  ----------------
$blobchangefeed/idx/segments/1601/01/01/0000/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1810/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/22/1910/meta.json                  BlockBlob                      584  application/json
$blobchangefeed/idx/segments/2019/02/23/0110/meta.json                  BlockBlob                      584  application/json

Nota:

$blobchangefeed/idx/segments/1601/01/01/0000/meta.json se crea automáticamente cuando se habilita la fuente de cambios. Puede omitir este archivo sin problemas. Es un archivo de inicialización que siempre está vacío.

El archivo de manifiesto del segmento (meta.json) muestra la ruta de acceso de los archivos de la fuente de cambios para ese segmento en la propiedad chunkFilePaths. A continuación, se muestra un ejemplo de un archivo de manifiesto de segmento.

{
    "version": 0,
    "begin": "2019-02-22T18:10:00.000Z",
    "intervalSecs": 3600,
    "status": "Finalized",
    "config": {
        "version": 0,
        "configVersionEtag": "0x8d698f0fba563db",
        "numShards": 2,
        "recordsFormat": "avro",
        "formatSchemaVersion": 1,
        "shardDistFnVersion": 1
    },
    "chunkFilePaths": [
        "$blobchangefeed/log/00/2019/02/22/1810/",
        "$blobchangefeed/log/01/2019/02/22/1810/"
    ],
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-22T18:11:01.187Z",
        "data": {
            "aid": "55e507bf-8006-0000-00d9-ca346706b70c"
        }
    }
}

Nota:

El contenedor $blobchangefeed solo aparece después de haber habilitado la característica de fuente de cambios en su cuenta. Tendrá que esperar unos minutos después de habilitar la fuente de cambios para poder ver los blobs del contenedor.

Registros de eventos de cambio

Los archivos de la fuente de cambios contienen una serie de registros de eventos de cambio. Cada registro de evento de cambio corresponde a un cambio en un blob individual. Los registros se serializan y se escriben en el archivo mediante la especificación de formato de Apache Avro. Los registros se pueden leer si se usa la especificación de formato de archivo Avro. Hay varias bibliotecas disponibles para procesar archivos en ese formato.

Los archivos de la fuente de cambios se almacenan en el directorio virtual $blobchangefeed/log/ como blobs en anexos. El primer archivo de fuente de cambios de cada ruta de acceso tendrá 00000 en el nombre de archivo (por ejemplo, 00000.avro). El nombre de cada archivo de registro subsiguiente agregado a esa ruta de acceso se incrementará en 1 (por ejemplo, 00001.avro).

Esquemas de registros de eventos

Para una descripción de cada propiedad, consulte Esquema de eventos de Azure Event Grid para Blob Storage. Los eventos BlobPropertiesUpdated y BlobSnapshotCreated actualmente son exclusivos de la fuente de cambios y aún no se admiten para los eventos de Blob Storage.

Nota:

Los archivos de la fuente de cambios de un segmento no aparecen inmediatamente después de crear un segmento. La duración del retraso se encuentra dentro del intervalo normal de la latencia de publicación de la fuente de cambios que se encuentra dentro de unos minutos del cambio.

Versión 1 del esquema

Los siguientes tipos de eventos se pueden capturar en los registros de fuente de cambios con la versión 1 del esquema:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

En el ejemplo siguiente se muestra un registro de evento de cambio en formato JSON que usa la versión 1 del esquema de eventos:

{
    "schemaVersion": 1,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T12:59:41.4003102Z",
    "id": "322343e3-8020-0000-00fe-233467066726",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "f0270546-168e-4398-8fa8-107a1ac214d2",
        "requestId": "322343e3-8020-0000-00fe-233467000000",
        "etag": "0x8D9F2155CBF7928",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "storageDiagnostics": {
            "bid": "9d725a00-8006-0000-00fe-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

Versión 3 del esquema

Los siguientes tipos de eventos se pueden capturar en los registros de fuente de cambios con la versión 3 del esquema:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated

En el ejemplo siguiente se muestra un registro de evento de cambio en formato JSON que usa la versión 3 del esquema de eventos:

{
    "schemaVersion": 3,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:05:19.6798242Z",
    "id": "eefe8fc8-8020-0000-00fe-23346706daaa",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "00c0b6b7-bb67-4748-a3dc-86464863d267",
        "requestId": "eefe8fc8-8020-0000-00fe-233467000000",
        "etag": "0x8D9F216266170DC",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "storageDiagnostics": {
            "bid": "9d726370-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

Versión 4 del esquema

Los siguientes tipos de eventos se pueden capturar en los registros de fuente de cambios con la versión 4 del esquema:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated
  • RestorePointMarkerCreated

En el ejemplo siguiente se muestra un registro de evento de cambio en formato JSON que usa la versión 4 del esquema de eventos:

{
    "schemaVersion": 4,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:08:42.4835902Z",
    "id": "ca76bce1-8020-0000-00ff-23346706e769",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "58fbfee9-6cf5-4096-9666-c42980beee65",
        "requestId": "ca76bce1-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2169F42D701",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:08:42.4825913Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot": "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "storageDiagnostics": {
            "bid": "9d72687f-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

Versión 5 del esquema

Los siguientes tipos de eventos se pueden capturar en los registros de fuente de cambios con la versión 5 del esquema:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated

En el ejemplo siguiente se muestra un registro de evento de cambio en formato JSON que usa la versión 5 del esquema de eventos:

{
    "schemaVersion": 5,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2022-02-17T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2022-02-17T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2022-02-17T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2022-02-17T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2022-02-17T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2022-02-17T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

Versión 6 del esquema

Los siguientes tipos de eventos se pueden capturar en los registros de fuente de cambios con la versión 6 del esquema:

  • BlobCreated
  • BlobDeleted
  • BlobPropertiesUpdated
  • BlobSnapshotCreated
  • BlobTierChanged
  • BlobAsyncOperationInitiated

La versión 6 del esquema agrega compatibilidad con el nivel de acceso esporádico.

En el ejemplo siguiente se muestra un registro de evento de cambio en formato JSON que usa la versión 6 del esquema de eventos:

{
    "schemaVersion": 6,
    "topic": "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "subject": "/blobServices/default/containers/<container>/blobs/<blob>",
    "eventType": "BlobCreated",
    "eventTime": "2023-10-11T13:12:11.5746587Z",
    "id": "62616073-8020-0000-00ff-233467060cc0",
    "data": {
        "api": "PutBlob",
        "clientRequestId": "b3f9b39a-ae5a-45ac-afad-95ac9e9f2791",
        "requestId": "62616073-8020-0000-00ff-233467000000",
        "etag": "0x8D9F2171BE32588",
        "contentType": "application/octet-stream",
        "contentLength": 128,
        "blobType": "BlockBlob",
        "blobVersion": "2023-10-11T16:11:52.5901564Z",
        "containerVersion": "0000000000000001",
        "blobTier": "Archive",
        "url": "https://www.myurl.com",
        "sequencer": "00000000000000010000000000000002000000000000001d",
        "previousInfo": {
            "SoftDeleteSnapshot": "2023-10-11T13:12:11.5726507Z",
            "WasBlobSoftDeleted": "true",
            "BlobVersion": "2024-02-17T16:11:52.0781797Z",
            "LastVersion" : "2023-10-11T16:11:52.0781797Z",
            "PreviousTier": "Hot"
        },
        "snapshot" : "2023-10-11T16:09:16.7261278Z",
        "blobPropertiesUpdated" : {
            "ContentLanguage" : {
                "current" : "pl-Pl",
                "previous" : "nl-NL"
            },
            "CacheControl" : {
                "current" : "max-age=100",
                "previous" : "max-age=99"
            },
            "ContentEncoding" : {
                "current" : "gzip, identity",
                "previous" : "gzip"
            },
            "ContentMD5" : {
                "current" : "Q2h1Y2sgSW51ZwDIAXR5IQ==",
                "previous" : "Q2h1Y2sgSW="
            },
            "ContentDisposition" : {
                "current" : "attachment",
                "previous" : ""
            },
            "ContentType" : {
                "current" : "application/json",
                "previous" : "application/octet-stream"
            }
        },
        "asyncOperationInfo": {
            "DestinationTier": "Hot",
            "WasAsyncOperation": "true",
            "CopyId": "copyId"
        },
        "blobTagsUpdated": {
            "previous": {
                "Tag1": "Value1_3",
                "Tag2": "Value2_3"
            },
            "current": {
                "Tag1": "Value1_4",
                "Tag2": "Value2_4"
            }
        },
        "restorePointMarker": {
            "rpi": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpp": "cbd73e3d-f650-4700-b90c-2f067bce639c",
            "rpl": "test-restore-label",
            "rpt": "2023-10-11T13:56:09.3559772Z"
        },
        "storageDiagnostics": {
            "bid": "9d726db1-8006-0000-00ff-233467000000",
            "seq": "(2,18446744073709551615,29,29)",
            "sid": "4cc94e71-f6be-75bf-e7b2-f9ac41458e5a"
        }
    }
}

Especificaciones

  • Los registros de eventos de cambio solo se anexan a la fuente de cambios. Una vez que se anexan estos registros, son inmutables y la posición de registro es estable. Las aplicaciones cliente pueden mantener su propio punto de control en la posición de lectura de la fuente de cambios.

  • Los registros de eventos de cambio se anexan en cuestión de minutos después del cambio. Las aplicaciones cliente pueden optar por consumir los registros a medida que se anexan para el acceso de streaming o de manera masiva en cualquier otro momento.

  • Los registros de eventos de cambio se organizan por orden de modificación por blob. El orden de los cambios entre blobs no está definido en Azure Blob Storage. Todos los cambios en un segmento anterior son previos a cualquier cambio en los segmentos posteriores.

  • Los registros de eventos de cambio se serializan en el archivo de registro mediante la especificación de formato Apache Avro 1.8.2.

  • Los registros de eventos de cambio en los que eventType tiene un valor de Control son registros del sistema interno y no reflejan un cambio en los objetos de la cuenta. Puede omitir estos registros sin problemas.

  • Los valores del contenedor de propiedades storageDiagnostics son solo para uso interno y no están diseñados para su uso por parte de la aplicación. Las aplicaciones no deben tener una dependencia contractual de esos datos. Puede omitir esas propiedades sin problemas.

  • El tiempo representado por el segmento es aproximado con límites de 15 minutos. Por lo tanto, para garantizar el consumo de todos los registros dentro de un tiempo especificado, consuma el segmento de hora consecutivo anterior y siguiente.

  • Cada segmento puede tener un número diferente de chunkFilePaths debido a la creación de particiones internas de la secuencia de registro para administrar el rendimiento de la publicación. Se garantiza que los archivos de registro de cada chunkFilePath contienen blobs mutuamente excluyentes y se pueden consumir y procesar en paralelo sin infringir el orden de las modificaciones por blob durante la iteración.

  • Los segmentos empiezan con el estado Publishing. Una vez que los registros se anexen al segmento, el estado será Finalized. La aplicación no debe utilizar los archivos de registro de un segmento que tenga una fecha posterior a la fecha de la propiedad LastConsumable en el archivo $blobchangefeed/meta/Segments.json. Este es un ejemplo de la propiedad LastConsumable en un archivo $blobchangefeed/meta/Segments.json:

{
    "version": 0,
    "lastConsumable": "2019-02-23T01:10:00.000Z",
    "storageDiagnostics": {
        "version": 0,
        "lastModifiedTime": "2019-02-23T02:24:00.556Z",
        "data": {
            "aid": "55e551e3-8006-0000-00da-ca346706bfe4",
            "lfz": "2019-02-22T19:10:00.000Z"
        }
    }
}

Condiciones y problemas conocidos

En esta sección se describen los problemas conocidos y las condiciones de la versión actual de la fuente de cambios.

  • Si habilita reglas de firewall para la cuenta de almacenamiento, es posible que se bloqueen las solicitudes de administración del ciclo de vida para eliminar blobs dentro del contenedor $blobchangefeed. Puede desbloquear estas solicitudes proporcionando excepciones para los servicios de confianza de Microsoft. Para obtener más información, consulte la sección Excepciones de Configuración de redes virtuales y firewalls de Azure Storage.
  • La propiedad LastConsumable del archivo segment.json no muestra el primer segmento que la fuente de cambios finaliza. Este problema solo se produce una vez finalizado el primer segmento. Todos los segmentos posteriores después de la primera hora se capturan con precisión en la propiedad LastConsumable.
  • Actualmente no es posible ver el contenedor $blobchangefeed al invocar la API de ListContainers. Puede ver el contenido llamando directamente a la API de ListBlobs en el contenedor de $blobchangefeed.
  • La conmutación por error de la cuenta de almacenamiento con redundancia geográfica con la fuente de cambios habilitada puede provocar incoherencias entre los registros de fuente de cambios y los datos de blob o metadatos. Para más información sobre estas incoherencias, consulte Incoherencias entre la fuente de cambios y los datos blob.
  • Es posible que vea errores 404 (no encontrado) y 412 (error de condición previa) en los contenedores de $blobchangefeed y $blobchangefeedsys. Puede omitir estos errores con seguridad.
  • Los eventos BlobDeleted no se generan cuando se eliminan las versiones o instantáneas de blobs. Solo se agrega un evento BlobDeleted cuando se elimina un blob base (raíz).
  • Los registros de eventos solo se agregan para los cambios en los blobs resultantes de las solicitudes al punto de conexión de Blob Service (blob.core.windows.net). Los cambios resultantes de las solicitudes al punto de conexión de Data Lake Storage (dfs.core.windows.net) no se registran y no aparecen en los registros de fuente de cambios.

Preguntas más frecuentes

Consulte las preguntas frecuentes de compatibilidad con la fuente de cambios.

Compatibilidad de características

La compatibilidad con esta característica puede verse afectada al habilitar Data Lake Storage Gen2, el protocolo Network File System (NFS) 3.0 o el Protocolo de transferencia de archivos SSH (SFTP). Si ha habilitado cualquiera de estas funcionalidades, consulte Compatibilidad con características de Blob Storage en cuentas de Azure Storage para evaluar la compatibilidad con esta característica.