使用跳转功能重放和完全清除消息

您在 Pub/Sub 中确认消息后 订阅者客户端无法访问。此外,订阅者客户端必须处理订阅中的每条消息,即使只需要一部分消息也是如此。

跳转功能将订阅者功能扩展到 允许您批量更改消息的确认状态。例如,您可以重放以前确认的消息或批量完全清除消息。此外,您可以复制一项订阅的确认状态 将还原功能与快照结合使用,以切换到另一个实例。

有关这些功能工作原理的快速演示,请参阅 通过跳转至快照或时间戳来重放 Pub/Sub 中的消息

快照和还原概览

Pub/Sub 快照具有耐用性、一致性和可靠性 订阅的消息确认 (ack) 状态的时间点视图。 快照会记录集群中所有消息的确认状态, 所有可用事件。快照会保留 创建时源订阅的未确认消息 快照创建完成后,发布到主题的任何消息 创建。

快照的生命周期由来源的现有积压决定 订阅。生命周期等于 7 天减去最长的存在时间 订阅中未确认的消息。例如,假设某个 订阅存在积压,其中最早的未确认消息为 1 天 旧。快照将在 6 天后过期。创建快照时必须设置此时间轴 提供强有力的至少一次送达保证。

快照的最长生命周期为七天。 您无法创建在 其创建时间。

通过跳转功能,您可以跳转至某次特定快照或时间戳, 订阅。借助此功能,您可以控制 从特定时间点或特定快照传送消息。

如需还原至过去某一时间并重放之前已确认的消息,您必须先配置主题的消息保留或配置订阅以保留已确认的消息:

跳转操作的最终一致性

跳转操作在消息传送方面严格一致 有保证。这意味着任何待确认的消息 则保证最终传送成功, 在跳转操作成功后触发。不过,系统并不会立即发送 与还原操作保持一致。因此,在还原时间戳之前发布的消息或在快照中确认的消息可能会在还原操作之后传送。从某种意义上说,消息传送是 具有最终一致性的系统;可能需要 将操作完全生效的时间控制在一分钟。

跳转操作的用例

  • 安全地更新订阅者代码。 部署新订阅者代码的一个问题是新的可执行文件可能会错误地确认消息,导致消息丢失。将快照合并到部署过程中,可让您从新订阅者代码中的 Bug 进行恢复。
  • 从意外的订阅者问题中恢复。如果订阅者问题与特定部署事件无关,您可能没有相关快照。在这种情况下,如果您为订阅启用了“保留确认过的消息”,则还原至过去某一时间可让您从错误中恢复。
  • 节省处理时间和费用。对不再相关的大量积压消息执行批量确认。
  • 根据已知数据测试订阅者代码。 在测试订阅者代码的性能和一致性时,每次运行都使用相同的数据会很有用。 快照通过强大的语义实现了数据的一致性。此外,快照还可以应用于给定主题的任何订阅,包括新创建的订阅。

配置消息保留

您可以为主题配置消息保留,也可以配置其 订阅以保留已确认的消息。您可能需要配置主题 消息保留(如果您希望消息保留一段时间以便重放) 超过订阅配置的消息保留时长。在本课中, 主题的项目和订阅的项目都会产生费用 消息存储方式。

如果未配置主题消息保留功能,则当未确认的消息的存在时间超过订阅的 message_retention_duration 属性时,系统会从订阅中删除该消息。另一方面,如果配置了主题消息保留功能,则只有在未确认的消息的存在时间超过主题的和订阅的 message_retention_duration 上限时,系统才会从订阅中删除该消息。

配置主题消息保留

默认情况下,Pub/Sub 主题会在附加到该主题的所有订阅确认消息后立即舍弃消息。配置具有消息保留功能的主题可提高灵活性, 与该主题相关的任何订阅,可回顾过去并重放 直到该主题的 message_retention_duration。 主题消息保留功能还允许订阅重放您在创建订阅之前发布的消息。

主题最多可将已发布的消息保留 31 天(可通过 主题的 message_retention_duration 属性)。 都已被所有附加的订阅确认。在主题 message_retention_duration大于订阅的 message_retention_duration 时,Pub/Sub 仅会在以下情况下舍弃消息: 其存在时间超出了主题的 message_retention_duration

如果启用了主题消息保留功能,则保留的消息的存储费用 系统会向该主题的项目收取相应费用。

控制台

如需创建启用了消息保留功能的主题,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。

    转到“主题”页面

  2. 点击创建主题

  3. 主题 ID 字段中,输入主题 ID。

  4. 启用设置消息保留时长

    其他选项保留为默认设置。

  5. 消息保留时长下拉菜单中,选择要 邮件的保留天数、小时数和分钟数。

  6. 点击创建主题以保存主题。

如需更新主题的消息保留设置,请执行以下操作:

  1. Pub/Sub 主题页面中选择您的主题。

    转到“主题”页面

  2. 点击主题详情页面顶部的修改

  3. 根据需要调整保留时间或启用或停用消息保留功能 选中或取消选中启用邮件保留功能选项。

  4. 点击更新以保存对主题的更改。

gcloud

如需创建消息保留时长为 7 天的主题,请使用以下 gcloud pubsub topics create 命令:

gcloud pubsub topics create TOPIC_ID --message-retention-duration=7d

您可以使用 gcloud pubsub topics update 更新此设置。 您也可以为现有主题启用消息保留功能:

gcloud pubsub topics update TOPIC_ID --message-retention-duration=1d

您还可以使用 update 命令停用主题的消息保留功能:

gcloud pubsub topics update TOPIC_ID --clear-message-retention-duration

配置订阅消息保留

在以下情况下,Pub/Sub 会开始代表订阅保留消息: 创建订阅。默认情况下,Pub/Sub 会将 从订阅发送消息。 未确认的消息默认保留 7 天(可由 订阅的 message_retention_duration 属性)。

配置订阅以保留已确认的消息(使用 retain_acked_messages 属性),让您可以重放以前确认的消息 由订阅保留。您可以将邮件配置为 最长 7 天。此配置同时适用于 已确认和未确认的消息。不过,邮件可以保留在 订阅超过 7 天(如果配置了消息保留时长) 超过 7 天。

如果订阅配置为保留已确认的消息,则会产生存储费用 由订阅保留的已确认消息所产生的费用将计入 订阅的项目。

控制台

如需创建启用了保留已确认消息的订阅,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。

    转到“订阅”页面

  2. 点击创建订阅

  3. 订阅 ID 字段中,输入订阅的 ID。

  4. 使用邮件保留时长下拉菜单选择保留邮件的天数、小时数和分钟数。

  5. 启用保留已确认的消息。其他选项保留为默认设置。

  6. 点击创建订阅以保存订阅。

如需更新订阅的消息保留设置,请执行以下操作:

  1. Pub/Sub 订阅页面选择您的订阅。

    转到“订阅”页面

  2. 点击订阅详情页面顶部的修改

  3. 调整消息保留时长,或者启用或停用保留已确认的消息 选中或取消选中标记为保留已确认消息的字段 消息

  4. 点击更新以保存对订阅的更改。

gcloud

如需创建启用了保留已确认消息的订阅,请使用以下 gcloud pubsub subscriptions create 命令:

gcloud pubsub subscriptions create SUBSCRIPTION_ID
    --retain-acked-messages
    --message-retention-duration=5d

您可以使用 gcloud pubsub subscriptions update 更新此设置。这也让您可以保留现有 订阅:

gcloud pubsub subscriptions update SUBSCRIPTION_ID --message-retention-duration=1d

您还可以使用 update 命令停用订阅的已确认消息保留功能:

gcloud pubsub subscriptions update SUBSCRIPTION_ID --no-retain-acked-messages

创建快照

您可以使用控制台、Google API 或 Google Cloud CLI CLI。

控制台

如需创建快照,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到快照页面。

    转到“快照”页面

  2. 点击创建快照

  3. 选择 Pub/Sub 订阅部分,选择一个订阅。

  4. 对于快照 ID,输入快照的名称。

    如需详细了解如何命名 Pub/Sub 资源,请参阅 主题、订阅、架构或快照命名准则

  5. 点击创建以创建快照。

您也可以在订阅页面创建概况。如果您 在创建订阅后立即创建快照 由于新创建的订阅的传播延迟而导致的错误。

gcloud

如需创建快照,请使用 正在关注 gcloud pubsub snapshots create 命令:

gcloud pubsub snapshots create \
    --project=PROJECT_ID \
    --subscription=SUBSCRIPTION_ID \
    SNAPSHOT_ID

替换以下内容:

  • PROJECT_ID。指定项目的 ID。

  • SUBSCRIPTION_ID。指定订阅的 ID。

  • SNAPSHOT_ID。指定快照的 ID。

还原至某一时间戳

还原至某一时间会将 Pub/Sub 收到的所有消息标记为 与已确认的时间相同 未确认。

您可以根据时间戳执行以下类型的还原操作:

  • 如需完全清除所有邮件,您可以还原至将来的某一时间。

  • 要重放和重新处理以前确认的消息,请还原至 过去的时间。

消息发布时间由 Pub/Sub 生成 (请参阅 publishTime )。这种方法并不精确,原因如下:

  • Pub/Sub 服务器之间可能存在时钟偏差。

  • Pub/Sub 必须使用发布请求的到达时间而不是源系统中事件的发生时间。

您可以使用控制台、Google API 或 Google Cloud CLI CLI。在跳转至订阅的时间戳之前, 确保在订阅上启用消息保留功能。

控制台

如需跳转至某个时间戳,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往订阅页面。

    前往“订阅”

  2. 点击已启用消息保留功能的订阅。

  3. 在“订阅详情”页面中,点击重放消息

  4. 跳转部分,点击到上一个时间点

  5. 选择合适的日期和时间,然后点击跳转

gcloud

要跳转至某个时间戳,请使用 正在关注 gcloud pubsub subscriptions seek 命令:

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --time=TIME \

替换以下内容:

  • TIME:您要在哪个时间点执行 跳转操作。
  • SUBSCRIPTION_ID:订阅的 ID。

有关支持的时间格式的详细信息,请参阅 gcloud topic DateTimes

跳转至快照

您可以重放未确认的消息,只需使用快照还原至任何 该主题的所有订阅的部分

与还原至时间点不同,您无需执行任何特殊订阅配置即可还原至快照。您只需提前创建快照。例如,您可以在部署新订阅者代码时创建快照,以防您需要从意外或错误的确认中恢复。

如果订阅中的积压时间过久,且产生的快照 将在 1 小时内过期,则还原操作将失败。

您可以使用控制台、Google API 或 Google Cloud CLI CLI。

控制台

如需还原至快照,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往订阅页面。

    前往“订阅”

  2. 点击相应订阅。

  3. 在“订阅详情”页面中,点击重放消息

  4. 还原部分,点击转至快照

  5. 选择相应的快照,然后点击还原 (Seek)。

gcloud

要还原至某一快照,请使用 正在关注 gcloud pubsub subscriptions seek 命令:

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --snapshot=SNAPSHOT_ID

替换以下内容:

  • SNAPSHOT_ID:快照的 ID。 快照的主题必须与订阅的主题相同。
  • SUBSCRIPTION_ID:订阅的 ID。

使用滤镜跳转

您可以重放带有过滤条件的订阅传来的消息。如果您使用带有过滤条件的订阅来查找时间戳,Pub/Sub 服务只会重新传送与过滤条件匹配的消息。

带有过滤条件的订阅快照包含以下消息:

  • 早于快照的所有消息,包括与过滤条件不匹配的消息。
  • 早于快照的未确认消息。

如果您使用包含过滤条件的订阅还原快照,Pub/Sub 服务只会重新传送快照中与还原请求匹配的订阅过滤条件相匹配的消息。

如需详细了解过滤条件,请参阅过滤消息

利用死信主题进行跳转

如果您希望查找包含0死信主题的订阅消息,Pub/Sub 会将传送尝试设置为 。您通过这些订阅收到的消息中有一个统计传送尝试次数的字段。

如需详细了解死信主题,请参阅转发到死信主题

使用重试政策跳转

如果您通过重试政策查找订阅中的消息,Pub/Sub 会重置以下各项之间的延迟:

  1. 确认截止时间即将到期或订阅者发送否定确认。
  2. Pub/Sub 重新发送该消息。

如需详细了解重试政策,请参阅使用重试政策

仅通过一次传送就跳转

如果您在仅传送一次的订阅中还原消息, Pub/Sub 会重新发送之前确认的 符合投放条件。针对在跳转之前提交的致谢 都会失败。跳转操作 最终一致性

如需详细了解重试政策,请参阅 仅传送一次