通过跳转至快照或时间戳,在 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 中。 在以下情况下,系统会自动满足 gcloud CLI 的安装前提条件: 创建一个全新的 Compute Engine 机器实例 访问权限范围包括所有 Cloud API 和默认 Debian 映像。最简单的创建方法是通过 Compute Engine 界面。对于本文档的其余部分,我们将假设您使用的是这些命令行工具之一。

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

创建快照和还原至快照

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

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 topic DateTimes

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

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 支持页面提供了其他资源和链接。

后续步骤

请参阅重放和舍弃消息