重放和完全清除消息

Pub/Sub 订阅者数据 API(例如拉取)提供对消息数据的有限访问权限。 通常,给定订阅的订阅者无法访问已确认的消息。此外,订阅者客户端必须处理订阅中的每条消息,即使只需要一部分消息也是如此。

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

这些功能如下所述。但是,您可以查看快速入门以获取工作示例。

配置消息保留

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

如果未配置主题消息保留功能,则当未确认的消息的存在时间超过订阅的 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 时,Pub/Sub 才会舍弃消息。

如果启用了主题消息保留,则由主题保留的消息的存储费用将计入主题的项目。

控制台

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

  1. 在 Cloud Console 中,转到 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

订阅消息保留

默认情况下,订阅会在消息确认后立即舍弃消息。未确认的消息会保留默认 7 天(可通过订阅的 message_retention_duration 属性配置)。通过配置订阅来保留已确认的消息(通过 retain_acked_messages 属性),您可以重放之前由订阅保留的已确认消息。订阅中的消息最多可保留 7 天,无论它们是已确认还是未确认。换句话说,订阅中最早的消息的存在时间不会超过 7 天。

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

控制台

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

  1. 在 Cloud Console 中,转到 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=true
    --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 --retain_acked_messages=false

还原至某一时间戳

还原至某一时间会将 Pub/Sub 在该时间之前收到的每条消息标记为已确认,以及将在该时间之后收到的所有消息标记为未确认。您可以还原至将来的某一时间以完全清除消息。如需重放和重新处理先前确认过的消息,请还原至过去的某一时间。消息发布时间由 Pub/Sub 服务器生成(请参阅 API 参考文档中的 publishTime)。由于以下原因,此方法不精确:

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

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

还原至快照

快照功能允许您捕获订阅的消息确认状态。创建快照后,快照会保留以下消息:

  • 创建快照时来源订阅中未确认的所有消息。

  • 此后发布到主题的任何消息。

通过使用快照来还原至主题的任何订阅,您可以重放这些未确认的消息。

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

在以下情况下快照会过期并由系统删除(二者取其先):

例如,设想某一订阅的快照,此订阅的积压中最早的未确认消息已保留一天时间。快照将在六天(而不是七天)后过期。此时间轴对于快照提供强有力的至少传送一次保证是必要的。

最终一致性

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

通过过滤条件查找

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

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

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

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

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

通过死信主题查找

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

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

通过重试政策查找

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

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

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

使用场景

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

后续步骤

您可以将 Pub/Sub 与 Dataflow 搭配使用。但是,我们不建议从正在运行的 Dataflow 流水线中直接使用 Pub/Sub 还原功能。如需了解建议的工作流,请参阅将 Pub/Sub 与 Dataflow 搭配使用