通过跳转至快照或时间戳,在 Pub/Sub 中重放消息
在您确认消息后,Pub/Sub 将无法检索这些消息。不过,有时您可能需要重放已确认的消息,例如,如果您执行了错误的确认操作。然后,您可以使用还原功能将之前确认的消息标记为未确认,并强制 Pub/Sub 重新传送这些消息。您还可以使用跳转功能,将未确认的消息的状态更改为已确认,从而删除这些消息。
还原至快照或还原至某个时间戳,以重放订阅中的消息。本指南举例说明如何使用跳转功能重放之前确认的 Pub/Sub 消息。
如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示:
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Set up a Google Cloud console project.
Click to:
- Create or select a project.
- Enable the Pub/Sub API for that project.
You can view and manage these resources at any time in the Google Cloud console.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Set up a Google Cloud console project.
Click to:
- Create or select a project.
- Enable the Pub/Sub API for that project.
You can view and manage these resources at any time in the Google Cloud console.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
使用 gcloud
命令行界面
使用 gcloud 的最简单方法是在 Cloud Shell 中。 你还可以使用命令行工具 安装在 Google Cloud CLI 中。 如果您创建具有访问权限范围(包括所有 Cloud API 和默认 Debian 映像)的全新 Compute Engine 机器实例,则会自动满足 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 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 控制台的订阅详细信息页面中创建快照或还原至现有快照。 如需了解快照命名规则,请参阅资源名称。
创建快照
在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。
从列表中选择订阅。
点击创建快照。
输入快照的 ID,然后点击创建进行保存。
您可以在 Google Cloud 控制台中的“快照”页面上查看快照。您还可以在单个主题的详细信息页面中管理快照。
重放订阅
重放消息对话框可让您还原至上一个时间点或已保存的快照。如需打开对话框,请执行以下操作:
在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。
从列表中选择订阅。
点击重放消息。
在还原下,选择还原至上一个时间点或还原至某一快照,然后选择要还原至哪个时间点或快照。
点击还原以重放消息。
结果怎么样?
请注意,Pub/Sub 支持页面提供了其他资源和链接。
后续步骤
请参阅重放和舍弃消息。