Azure Blob 存储 中的更改馈送支持

更改源的用途是提供存储帐户中 Blob 和 Blob 元数据发生的所有更改的事务日志。 更改源提供这些更改的有序有保证持久不可变只读的日志。 客户端应用程序可以在流式处理或批处理模式下随时读取这些日志。 每次更改只生成一个事务日志条目,因此无需管理同一更改的多个日志条目。 通过变更提要,您可以构建高效且可缩放的解决方案,以较低的成本处理您Blob 存储帐户中发生的变更事件。

若要了解如何处理更改提要中的记录,请参阅 在 Azure Blob 存储 中处理更改提要

更改源的工作原理

更改源记录以 blob 格式存储在存储帐户中的特殊容器内,按标准 blob 定价计费。 你可以根据要求控制这些文件的保留期(请参阅当前版本的条件)。 更改事件被作为记录追加到更改日志中,并遵循 Apache Avro 格式规范,这是一种简洁、快速的二进制格式,能够通过内联架构提供丰富的数据结构。 此格式在 Hadoop 生态系统、流分析和Azure 数据工厂中广泛使用。

可通过异步、增量或整体方式处理这些日志。 任意数目的客户端应用程序都可以独立地并行读取更改馈送,按照自身的步调进行操作。 分析应用程序(例如 Apache DrillApache Spark)可以直接将日志用作 Avro 文件,使你能够以较低的成本和较高的带宽处理这些日志,而无需编写自定义应用程序。

下图显示了如何将记录添加到更改提要:

图中显示更改源如何提供 Blob 更改的有序日志

更改源支持非常适合基于已更改的对象处理数据的方案。 例如,应用程序可以执行以下操作:

  • 更新辅助索引,与缓存、搜索引擎或任何其他内容管理方案同步。
  • 基于对象变化提取业务分析的见解和指标,无论是通过流式处理方式还是批处理模式。
  • 针对企业数据管理的安全性、合规性或智能,存储、审核和分析对象在任意时间段内发生的更改。
  • 生成解决方案来备份、镜像或复制帐户中的对象状态,以满足灾难管理或合规性要求。
  • 生成连接的应用程序管道,以便根据创建的或更改的对象来响应更改事件或计划执行。

更改源是对象复制块 blob 的时间点还原的先决条件功能。

注意

更改 Feed 提供一个持久且有序的日志模型来记录发生在 Blob 中的更改。 在发生更改后的几分钟内,这些更改就会写入并出现在更改源日志中。 如果应用程序必须更快地响应事件,请考虑改用 Blob 存储 事件Blob 存储 事件提供实时的一次性事件,使得“Azure Functions”或应用程序能够迅速对 blob 的更改做出反应。

启用和禁用更改源

必须为存储帐户启用更改馈送,才能开始捕获和记录更改。 禁用更改源可停止捕获更改。 可以在门户或 PowerShell 上使用Azure 资源管理器模板来启用和禁用更改。

启用更改源时,请注意以下几个事项。

  • 每个存储帐户中只有一个 Blob 服务的更改反馈。 更改提要记录存储在 $blobchangefeed 容器中。

  • 仅在 Blob 服务级别捕获“创建”、“更新”和“删除”更改。

  • 更改提要会记录帐户中发生的所有可用事件的所有变化。 客户端应用程序可根据需要筛选出事件类型。 (请参阅当前版本的条件)。

  • 只有标准通用 v2、高级块 Blob 和 Blob 存储帐户可以启用更改日志功能。 当前不支持启用了分层命名空间的帐户。 不支持常规用途 v1 存储帐户,但可以在不停机的情况下将其升级到常规用途 v2。有关详细信息,请参阅升级到 GPv2 存储帐户

  • 默认情况下,更改源无限期保留日志。 可以在天数内配置更改源日志的保留期,从而定义在自动删除之前保留日志的时间。 可以在更改源流的初始配置期间,或通过 Azure 门户中数据管理部分下的“数据保护”选项来修改此保留行为。

  • 若要删除所有现有的更改源日志,请将保留期更新为 1 天,然后禁用更改源功能。

使用 Azure 门户网站为存储帐户启用更改提要:

  1. Azure 门户中,选择存储帐户。

  2. 导航到 数据管理 下的 Data protection 选项。

  3. 在“跟踪”下,选择“启用 blob 更改馈送”。

  4. 选择“保存”按钮以确认数据保护设置。

    屏幕截图显示如何在 Azure 门户中启用更改馈送

使用更改数据流

变更馈送生成多个元数据文件和日志文件。 这些文件位于存储帐户的 $blobchangefeed 容器中。 $blobchangefeed 容器可以通过Azure门户或Azure 存储资源管理器进行查看。

客户端应用程序可以使用更改源处理器 SDK 提供的 Blob 更改源处理器库来消费更改源。 若要了解如何处理更改源中的记录,请参阅 在 Azure Blob 存储

更改源细分

更改源是按小时段组织的更改日志,但系统每隔几分钟就会在其中追加和更新内容。 仅当在该小时内发生了 Blob 更改事件时,才会创建这些段。 这使得客户端应用程序能够处理在特定时间范围内发生的更改,而无需搜索整个日志。 有关详细信息,请参阅规范

更改提要的可用的每小时段在一个清单文件中被描述,该文件指定了该段的更改提要文件的路径。 $blobchangefeed/idx/segments/ 虚拟目录的列表按时间顺序显示这些段。 段的路径描述该段所代表的小时时间范围的开始时间。 可以使用该列表筛选出你感兴趣的日志段。

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

注意

启用更改源时,会自动创建 $blobchangefeed/idx/segments/1601/01/01/0000/meta.json。 可以放心地忽略此文件。 它是一个始终为空的初始化文件。

段清单文件 (meta.json) 显示该段的更改源文件在 chunkFilePaths 属性中的路径。 下面是段落清单文件的示例。

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

注意

只有在您启用帐户的更改馈送功能之后,$blobchangefeed 容器才会显示。 启用更改源功能后,您需要等待几分钟,然后才能列出容器中的 blob。

更改事件记录

更改提要文件包含一系列更改事件记录。 每条更改事件记录对应于单个 Blob 发生的一项更改。 使用 Apache Avro 格式规范序列化记录并将其写入文件。 可以使用 Avro 文件格式规范读取记录。 有多个库可用于处理该格式的文件。

更改源文件以$blobchangefeed/log/ 的形式作为追加Blob存储在虚拟目录中。 每个路径下的第一个更改馈送文件的文件名中将包含 00000(例如 00000.avro)。 添加到该路径的每个后续日志文件的名称编号将递增 1(例如:00001.avro)。

事件记录架构

有关每个属性的说明,请参阅 Azure 事件网格 事件架构 for Blob 存储。 BlobPropertiesUpdated 和 BlobSnapshotCreated 事件目前是更改反馈的独占事件,尚不支持 Blob 存储 事件。

注意

创建某个段后,该段的更改源文件不会立即显示。 延迟时长处于正常的更改源发布延迟间隔范围内,而该间隔为更改后的几分钟内。

架构版本 1

以下事件类型可在架构版本 1 的变更提要记录中被捕获:

  • blob已创建
  • Blob已删除
  • Blob属性已更新
  • Blob快照已创建

以下示例显示了使用事件架构版本 1 的 JSON 格式的更改事件记录:

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

架构版本 3

可以在更改馈送记录中使用架构版本 3 捕获以下事件类型:

  • blob已创建
  • Blob已删除
  • Blob属性已更新
  • Blob快照已创建

以下示例显示了使用事件架构版本 3 的 JSON 格式的更改事件记录:

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

架构版本 4

可以使用架构版本 4 在更改源记录中捕获以下事件类型:

  • blob已创建
  • Blob已删除
  • Blob属性已更新
  • Blob快照已创建
  • Blob层级已更改
  • Blob异步操作已启动
  • 还原点标记已创建

以下示例显示了使用事件架构版本 4 的 JSON 格式的更改事件记录:

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

架构版本 5

可以使用架构版本 5 在更改源记录中捕获以下事件类型:

  • blob已创建
  • Blob已删除
  • Blob属性已更新
  • Blob快照已创建
  • Blob层级已更改
  • Blob异步操作已启动

以下示例显示了使用事件架构版本 5 的 JSON 格式的更改事件记录:

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

架构版本 6

可以在架构版本 6 的更改提要记录中捕获以下事件类型:

  • blob已创建
  • Blob已删除
  • Blob属性已更新
  • Blob快照已创建
  • Blob层级已更改
  • Blob异步操作已启动

架构版本 6 添加了对寒层的支持。

以下示例显示了使用事件架构版本 6 的 JSON 格式的更改事件记录:

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

规范

  • 更改事件记录只会追加到更改提要中。 一旦追加这些记录,它们就不可变,且记录位置是稳定的。 客户端应用程序可以在变更馈送的读取位置维护其自身的检查点。

  • 在更改后的几分钟内,就会追加更改事件记录。 客户端应用程序可以选择在追加记录后使用这些记录以进行流式访问,或者在任何其他时间批量使用这些记录。

  • 更改事件记录按每个 Blob 的修改顺序排序。 在Azure Blob 存储中未定义 blob 中的更改顺序。 前一段中的所有更改位于后续段中任何更改的前面。

  • 使用 Apache Avro 1.8.2 格式规范将更改事件记录序列化为日志文件。

  • eventType 值为 Control 的更改事件记录是内部系统记录,不反映对帐户中的对象所做的更改。 可以放心地忽略这些记录。

  • storageDiagnostics 属性包中的值仅供内部使用,按设计不供应用程序使用。 应用程序不应该对该数据存在协定性依赖关系。 可以放心地忽略这些属性。

  • 段所代表的时间是近似时间,其时长为 15 分钟。 因此,为了确保能够使用指定时间内的所有记录,请使用连续的前一小时和后一小时段。

  • 由于对日志流进行了内部分区以管理发布吞吐量,因此每个段可以包含不同数量的 chunkFilePaths。 保证每个 chunkFilePath 中的日志文件包含互斥的 Blob,并且可以并行使用和处理这些文件,而不会在迭代期间违反每个 Blob 的修改顺序。

  • 段的最初状态为“Publishing”。 一旦将记录追加到段的过程完成,其状态将变为“Finalized”。 应用程序不应使用创建日期晚于 LastConsumable 文件中的 $blobchangefeed/meta/Segments.json 属性日期的任何段中的日志文件。 下面是 LastConsumable 文件中 $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"
        }
    }
}

  • 如果由于客户配置错误(例如 KeyVaultNotFound 或身份验证失败)而阻止事件发布超过六个月,则事件会自动删除并垃圾回收。

条件和已知问题

本部分介绍当前变更提要版本中的已知问题和状况。

  • 如果为存储帐户启用防火墙规则,删除 $blobchangefeed 容器中 blob 的生命周期管理请求可能会被阻止。 可以通过为受信任的 Microsoft 服务提供例外来解除对这些请求的阻止。 有关详细信息,请参阅“配置防火墙和虚拟网络”中的“例外”部分。

  • segments.json 文件的 LastConsumable 属性不会列出更改提要最终确定的第一个段。 此问题只会在对第一个段进行最终处理之后才出现。 之后的每一个小时的所有后续段落都会被准确记录在 LastConsumable 属性中。

  • 目前,在调用 ListContainers API 时看不到 $blobchangefeed 容器。 可以通过直接在 $blobchangefeed 容器上调用 ListBlobs API 来查看内容。

  • 启用了更改提要的异地冗余存储帐户进行故障转移时,可能会导致更改提要日志与 Blob 数据和/或元数据之间出现不一致。 有关此类不一致的更多信息,请参阅更改提要和 Blob 数据不一致性

  • 您可能会看到 $blobchangefeed 和 $blobchangefeedsys 容器上报告了 404(未找到)和 412(前提条件失败)错误。 可以放心地忽略这些错误。

  • 删除 Blob 版本或快照时,不会生成 BlobDeleted 事件。 仅当删除基本(根)Blob 时,才会添加 BlobDeleted 事件。

  • 只会针对向 Blob 服务终结点 (blob.core.chinacloudapi.cn) 发出请求后导致发生的 Blob 更改添加事件记录。 不会记录来自 Data Lake Storage 终结点(dfs.core.chinacloudapi.cn)的请求所导致的更改,也不会显示在变更记录中。

  • $blobchangefeed容器如果在有待发布的事件挂起时被删除,系统会自动重新创建该容器。 在此方案中,客户以后可能会删除容器。

常见问题解答 (FAQ)

请参阅更改源支持常见问题解答

功能支持

启用Data Lake Storage Gen2、网络文件系统(NFS)3.0 协议或 SSH 文件传输协议(SFTP)可能会影响对此功能的支持。 如果已启用上述任何功能,请参阅 Azure 存储 帐户中的 Blob 存储 功能支持来评估此功能的支持。