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

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

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

如需快速演示这些功能的工作方式,请参阅 通过还原至快照或时间戳在 Pub/Sub 中重放消息

快照和还原概览

Pub/Sub 快照是一个持久且一致的视图,它以可靠的方式显示了订阅在某个时间点的消息确认 (ack) 状态。 快照会记录订阅中所有消息在创建时的确认状态。快照会保留创建快照时来源订阅的未确认消息,以及在创建快照后发布到主题的任何消息。

快照的生命周期由来源订阅的现有积压情况决定。生命周期等于 7 天减去订阅中最旧的未确认消息的保留时间。例如,设想某一订阅的快照,此订阅的积压中最早的未确认消息已保留 1 天时间。快照会在 6 天后过期。此时间轴对于快照提供强有力的至少传送一次保证是必要的。

快照的最长生命周期为 7 天。 您无法创建在创建后不到 1 小时就会过期的快照。

借助还原功能,您可以还原至订阅的特定快照或时间戳。借助此功能,您可以控制 Pub/Sub 如何从特定时间点或特定快照传送消息。

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

还原操作的最终一致性

还原操作与消息传送保证严格一致。这意味着任何基于还原条件而未被确认的消息,可保证在还原操作成功后最终至少传送一次。但是,已传送的消息不会立即与还原操作保持一致。因此,在还原时间戳之前发布的消息或在快照中确认的消息可能会在还原操作之后传送。从某种意义上说,消息传送作为相对于还原操作的最终一致系统运行;该操作可能需要一分钟才能完全生效。

还原操作的应用场景

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

创建快照

您可以使用控制台、Google API 或 Google Cloud 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 API 参考文档)。由于以下原因,此方法不精确:

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

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

您可以使用控制台、Google API 或 Google Cloud 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 创建快照。

控制台

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

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

    前往“订阅”页面

  2. 点击相应订阅。

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

  4. 对于还原 ,点击至快照

  5. 选择适当的快照,然后点击还原

gcloud

如需还原至快照,请使用以下 命令:gcloud pubsub subscriptions seek

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --snapshot=SNAPSHOT_ID

替换以下内容:

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

通过过滤条件查找

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

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

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

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

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

通过死信主题查找

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

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

通过重试政策查找

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

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

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

通过“仅传送一次”功能查找

如果您通过“仅传送一次”功能查找订阅中的消息,Pub/Sub 会重新发送之前确认过的符合传送条件的消息。对于在还原操作之前进行的传送,任何确认都会失败。还原操作具有 最终一致性

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