通过定位至某个快照或时间戳来重放 Pub/Sub 中的消息

确认消息后,Pub/Sub 将无法检索这些消息。但是,有时您可能会发现有必要重放已确认的消息,例如,在您执行了错误的确认时。然后,您可以使用跳转功能将之前已确认的消息标记为未确认,并强制 Pub/Sub 重新提交这些消息。您还可以使用还原功能将未确认的消息的状态更改为已确认,从而删除它们。

还原至快照或还原至时间戳以重放订阅中的消息。本指南举例说明了如何使用跳转功能重放以前确认的 Pub/Sub 消息。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 设置 Google Cloud 控制台项目。

    设置项目

    点击即可执行以下操作:

    • 创建或选择项目。
    • 为该项目启用 Pub/Sub API。

    您可以随时在 Google Cloud 控制台中查看和管理这些资源。

  3. 安装 Google Cloud CLI。
  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. 设置 Google Cloud 控制台项目。

    设置项目

    点击即可执行以下操作:

    • 创建或选择项目。
    • 为该项目启用 Pub/Sub API。

    您可以随时在 Google Cloud 控制台中查看和管理这些资源。

  6. 安装 Google Cloud CLI。
  7. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init

使用 gcloud 命令行界面

使用 gcloud 的最简单方法是在 Cloud Shell 中。 您也可以使用 Google Cloud CLI 随附的命令行工具。如果您创建全新的 Compute Engine 机器实例,其访问权限范围包括所有 Cloud API 和默认 Debian 映像,则 gcloud CLI 会自动满足设置前提条件。最简单的创建方法是通过 Compute Engine 界面。对于本文档的其余部分,我们将假设您使用的是这些命令行工具之一。

如需详细了解如何使用 gcloud,请参阅 gcloud 快速入门。 另外,如需查看 Pub/Sub gcloud 命令的完整列表,请参阅 gcloud 参考文档中的 gcloud pubsub 部分

创建快照和还原至快照

创建主题和订阅。请使用简短的确认截止期限以提升互动:

gcloud pubsub topics create seek-demo-topic
gcloud pubsub subscriptions create seek-demo-sub --topic=seek-demo-topic --ack-deadline=10

到目前为止,订阅中的消息尚未得到确认。通过创建快照来捕获此状态:

gcloud pubsub snapshots create my-snapshot --subscription=seek-demo-sub
gcloud pubsub snapshots list

现在发布、拉取和确认消息:

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

请注意,后续拉取不会产生新消息(可能会出现一些暂时性重复项):

gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

您可以通过将订阅还原至快照来恢复消息。 请注意,消息可能不会立即传送:Pub/Sub 不保证消息传送延迟。但是,可以保证快照中保留的消息最终将至少传送一次:

gcloud pubsub subscriptions seek seek-demo-sub --snapshot=my-snapshot
gcloud pubsub subscriptions pull seek-demo-sub --auto-ack

请注意,只要订阅的主题与快照的主题相同,您就可以将其他订阅还原到同一快照:

gcloud pubsub subscriptions create seek-demo-sub2 --topic=seek-demo-topic --ack-deadline=10
gcloud pubsub subscriptions seek seek-demo-sub2 --snapshot=my-snapshot

seek-demo-sub2 拉取现在将生成在创建 seek-demo-sub2 之前发布的消息:

gcloud pubsub subscriptions pull seek-demo-sub2 --auto-ack

不再使用快照后,请使用以下命令进行清理:

gcloud pubsub snapshots delete my-snapshot

还原至某一时间戳

重放已确认消息的另一种方法是还原至某一时间戳。要还原至某一时间戳,则必须首先配置订阅以使用 retain-acked-messages 保留已确认的消息。如果设置了 retain-acked-messages,Pub/Sub 会将已确认的消息保留 7 天。

只有在您打算还原至时间戳而不是快照时,才需要执行此步骤。

gcloud pubsub subscriptions update seek-demo-sub --retain-acked-messages

现在发布、拉取和确认消息:

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

下一次拉取应该不会返回任何消息:

gcloud pubsub subscriptions pull seek-demo-sub

现在将订阅回溯还原至某一时间以恢复消息。 请注意,date 命令的 GNU 和 BSD (MacOS) 版本之间的日期算术标志不同:

export TS_FORMAT=%Y-%m-%dT%H:%M:%SZ
gcloud pubsub subscriptions seek seek-demo-sub --time=$(date -u -d '-10 min' +$TS_FORMAT)

随后拉取应该会再次产生该消息:

gcloud pubsub subscriptions pull --auto-ack seek-demo-sub

您还可以使用还原功能来跳过在某个时间点(例如当前时间)之前发布的所有消息的传送。为此,请将订阅还原至当前时间,以将过去的所有消息都标记为已确认:

gcloud pubsub topics publish seek-demo-topic --message 'hello, world'
gcloud pubsub subscriptions seek seek-demo-sub --time=$(date -u +$TS_FORMAT)

经过一段传播延迟(约 60 秒)后,将不再传送消息。要进行此检查,您可以重复执行 pull 命令,但不确认消息:

gcloud pubsub subscriptions pull seek-demo-sub

使用 Cloud Console

您可以在 Cloud 控制台的订阅详细信息页面中创建快照或还原至现有快照。如需了解快照命名规则,请参阅资源名称

创建快照

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

    转到“订阅”页面

  2. 从列表中选择订阅。

  3. 点击创建快照

  4. 输入快照的 ID,然后点击创建进行保存。

您可以在 Google Cloud 控制台的“快照”页面上查看快照。您还可以在单个主题的详细信息页面中管理快照。

重放订阅

重放消息对话框可让您还原至上一个时间点或已保存的快照。如需打开对话框,请执行以下操作:

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

    转到“订阅”页面

  2. 从列表中选择订阅。

  3. 点击重放消息

  4. 还原下,选择还原至上一个时间点还原至某一快照,然后选择要还原至哪个时间点或快照。

  5. 点击还原以重放消息。

结果怎么样?

请注意,Pub/Sub 支持页面提供了其他资源和链接。

后续步骤

请参阅重放和舍弃消息