如果您将消息发布到全局 Pub/Sub 端点, Pub/Sub 会自动将消息存储在最近的 Google Cloud 区域中。如果您想控制将消息存储在哪些区域以及在哪些区域处理消息,可以针对主题配置消息存储政策。
消息存储政策概览
您可以在创建新主题时或使用控制台、Google Cloud CLI 或 REST API 更新主题时设置消息存储政策。
消息存储政策仅适用于消息内容。该政策不适用于其他数据,例如主题名称、标签或 Identity and Access Management (IAM) 设置。
当客户端将消息发布到 Pub/Sub 时,Pub/Sub 会存储消息。消息存储政策可确保 Pub/Sub 仅在您指定的一组 Google Cloud 区域中存储和处理消息,无论发布或 订阅请求来自何处。如果该政策允许发布 操作使用多个区域,则 Pub/Sub 会将消息存储在发布的消息进入网络时所处位置最近的允许使用的区域中。 Google Cloud
指定消息存储政策时,您可以将 enforceInTransit 设置为 True。此标志控制以下内容:
在消息存储政策不允许使用的区域中收到的发布、拉取和流式拉取请求会被拒绝,并显示
FAILED_PRECONDITION错误。如果客户端在允许使用的区域之一(例如 Compute Engine 虚拟机)内运行,则可以使用全局 端点。 Google Cloud 客户端的请求会在允许使用的区域中本地路由。 客户端还可以使用以允许使用的区域为目标的 定位端点 或区域性端点 。
如果客户端在不允许使用的区域内运行 Google Cloud , 或者在不允许使用的区域外运行 Google Cloud,则必须使用以允许使用的区域列表中的区域为目标的定位端点或区域性 端点。
推送订阅的传送仅在允许使用的 Cloud 区域内处理。在某些情况下,此限制可能会完全暂停推送订阅的消息传送。当推送订阅因推送位置受到消息存储位置、允许使用的区域和导出资源位置等因素的过度限制而进入此类状态时,此状态会在 Stackdriver 中显示。
新主题的消息存储政策
如果您在创建主题时未指定消息存储政策, 系统会根据有效的 资源位置限制 组织政策自动确定消息存储政策。 如果没有任何组织政策,则允许使用所有区域。
同样,在没有指定消息存储政策的情况下,
enforceInTransit标志会根据有效的对 Pub/Sub 消息强制执行传输中区域 组织政策确定。如需详细了解此组织政策,请参阅 组织政策限制条件。如果您在创建主题时指定消息存储政策,该储政策可以仅包含有效资源位置限制 组织政策所允许的区域。如果没有任何组织政策,则消息存储政策可以包含任何区域。
现有主题的消息存储政策
更新组织政策后,相应的更改不会自动传播 到现有主题。因此,现有主题的消息存储政策可能与最新的组织政策不同步。如需了解详情,请参阅管理组织政策与主题政策之间的差异。
更新主题的消息存储政策后,相应的更改不会传播 到已发布的消息。已根据旧政策存储的消息不会 更改为与更新后的政策一致。相应的更改仅适用于更新后发布的消息。
例外情况
该政策会指定允许使用的 Google Cloud 区域名称列表。因此,系统不支持以下两项:
- 排除列表
- 地区或多区域位置
如果您发布带有 排序键的消息,并且消息 存储政策排除最近的区域,则 Pub/Sub 服务 将返回错误。
配置消息存储政策
您可以通过以下两种方式为主题配置消息存储政策:
- 使用组织政策设置消息存储政策。
- 在创建主题时配置消息存储政策。
使用组织政策设置消息存储政策
控制台
如需配置适用于多个主题的消息存储政策,请设置资源位置限制 组织政策。
前往 Identity and Access Management 控制台中的 组织政策 页面。
选择要为其设置组织政策的资源层次结构节点(组织、文件夹或项目)。
在过滤条件中,输入资源位置限制 。
点击 Google Cloud - 资源位置限制。
点击修改 。
根据需要添加或移除区域。
您创建的所有新主题都会继承这些设置。更改不会自动传播到现有主题。如需更新现有主题,您 必须运行更新操作。
如需详细了解组织政策,请参阅管理 Google Cloud 资源。
在创建主题时配置消息存储政策
控制台
使用 Google Cloud 控制台时,您无法在创建主题时配置消息存储政策 。相反,所有新主题都会自动继承您的资源位置限制 组织政策。
不过,创建主题后,您可以在控制台中通过更新操作更改其消息存储政策。
gcloud CLI
如需创建具有特定消息存储政策的主题,请使用
gcloud pubsub topics create
命令和 --message-storage-policy-allowed-regions 标志:
gcloud pubsub topics create TOPIC_ID \ --message-storage-policy-allowed-regions=REGION1,REGION2
替换以下内容:
TOPIC_ID:新主题的 ID 或名称。REGION1, REGION2:受支持区域的逗号分隔列表。 Google Cloud
REST
如需创建具有消息存储政策的主题,请使用
projects.topics.create
方法。
必须使用 Authorization 标头中的访问令牌对请求进行身份验证。如需获取当前
应用默认凭据的访问令牌,请运行以下命令:gcloud auth application-default print-access-token。
POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
Authorization: Bearer $(gcloud auth application-default print-access-token)
Content-Type: application/json --data @response-body.json
在请求正文中指定以下字段:
{
"name": "projects/PROJECT_ID/topics/TOPIC_ID",
"messageStoragePolicy": {
"allowedPersistenceRegions": ["REGION"],
"enforceInTransit": true
}
}
其中:
PROJECT_ID 是项目 ID。
TOPIC_ID 是主题 ID。
REGION 是您指定的区域。
示例响应:
{
"name": "projects/PROJECT_ID/topics/TOPIC_ID",
"messageStoragePolicy": {
"allowedPersistenceRegions": [
"REGION"
],
"enforceInTransit": true
}
}
如需详细了解如何配置消息存储政策,请参阅以下 API 参考文档。
更新消息存储政策
控制台
在 Google Cloud 控制台中,打开 主题详细信息 页面。
选择要更新的主题。
您可以选择多个主题。
在信息面板 中,选择存储政策 标签页。
此面板可能默认处于收起状态。如果处于收起状态,请点击显示信息面板 。
根据需要选择或取消选择任意数量的区域。
点击更新 。
gcloud CLI
如需将组织的
资源位置限制政策 中定义的消息存储政策推送到主题,请运行以下
gcloud pubsub topics update
命令:
gcloud pubsub topics update TOPIC_ID \ --recompute-message-storage-policy
如需使用特定区域更新主题的消息存储政策,请运行 gcloud pubsub topics update 命令和 --message-storage-policy-allowed-regions 标志:
gcloud pubsub topics update TOPIC_ID \ --message-storage-policy-allowed-regions=REGION1,REGION2
替换以下内容:
TOPIC_ID:要更新的主题的 ID。REGION1, REGION2:受支持区域的逗号分隔列表。 Google Cloud
REST
如需使用消息存储政策更新主题,请使用
projects.topics.patch
方法。
必须使用 Authorization 标头中的访问令牌对请求进行身份验证。如需获取当前
应用默认凭据的访问令牌,请运行以下命令:gcloud auth application-default print-access-token。
PATCH https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
Authorization: Bearer $(gcloud auth application-default print-access-token)
Content-Type: application/json --data @response-body.json
在请求正文中指定以下字段:
{
"name": "projects/PROJECT_ID/topics/TOPIC_ID",
"messageStoragePolicy": {
"allowedPersistenceRegions": ["REGION"], // Replace with your required region
"enforceInTransit": true
}
}
其中:
PROJECT_ID 是项目 ID。
TOPIC_ID 是主题 ID。
REGION 是您指定的区域。
示例响应:
{
"name": "projects/PROJECT_ID/topics/TOPIC_ID",
"messageStoragePolicy": {
"allowedPersistenceRegions": [
"REGION"
],
"enforceInTransit": true
}
}
如需详细了解如何更新消息存储政策,请参阅以下 API 参考文档。
管理组织政策与主题政策之间的差异
查看组织政策与主题政策之间的差异
控制台
控制台会显示 Google Cloud 组织政策与 个别主题的消息存储政策之间的任何差异。
如需查看是否有任何主题与组织政策不同步,请执行以下操作:
前往主题详细信息 页面。
选择主题。
在信息面板 中,选择存储政策 标签页。
此面板可能默认处于收起状态。如果处于收起状态,请点击显示信息面板 。
面板中会显示您的存储政策,以及组织政策与主题政策之间的任何差异。
gcloud CLI
如需检查分配给主题的当前政策,请运行以下命令:
gcloud pubsub topics describe TOPIC_ID
替换以下内容:
TOPIC_ID:要检查的主题的 ID。
解决组织政策与主题政策之间的差异
控制台
在 Google Cloud 控制台中,打开 主题详细信息 页面。
选择主题。
在信息面板 中,选择存储政策 标签页。
此面板可能默认处于收起状态。如果处于收起状态,请点击显示信息面板 。
面板中会显示您的存储政策,以及任何差异。
如果存在任何差异,信息面板会显示三个选项,用于将主题的存储政策与组织政策同步,包括:
主题允许存储在不允许的位置 。
更新后,仅允许存储在政策允许的位置。
主题不允许存储在允许的部分位置 。
更新后,允许存储在政策允许的所有位置。
主题在不允许和允许的位置都已过期 。
更新后,允许存储在政策允许的位置。
选择适当的选项来解决问题。
点击更新主题 。
与组织存储政策同步 对话框随即会打开。
点击更新主题 。
监控和问题排查
为了帮助您了解消息数据的存储位置,Pub/Sub 提供了按每个 Google Cloud 区域划分的指标。
您可以使用这些指标来实现以下目的:
- 了解您的数据在世界范围内的分布情况。
- 根据这些数据优化发布者和订阅者的部署位置。
消息存储指标
未确认的存储消息的计数:
subscription/num_unacked_messages_by_region
存储数据量:
subscription/unacked_bytes_by_region
最早的消息存在时长:
subscription/oldest_unacked_message_age_by_region
主题和快照有类似的指标。此外,选择保留用于重放的已确认消息也有相应的指标。例如:
subscription/num_retained_acked_messages_by_region
性能和可用性影响
消息存储政策不会影响整体服务等级协议 (SLA),但是,如果发布者或订阅者在 Google Cloud 之外运行或者在该政策不允许使用的区域中运行,则该政策会影响可用性。 Google Cloud 在消息存储政策允许使用的区域集内运行发布者客户端的用户不会看到服务的延迟时间或可用性有什么变化。
如需了解这些影响,有必要考虑发布请求的路由方式。通常,Pub/Sub 会尝试将消息存储在尽可能靠近请求来源的位置。源自 Google Cloud 的请求通常会绑定到同一区域中的 Pub/Sub 实例。Google Cloud 如果发布者位于单个区域,则在消息存储政策中仅仅添加更多区域并不会提高可用性。 从 Google Cloud 外部发布时,需要额外的路由层来将请求发送到提供 Google CloudPub/Sub 服务的附近区域。 Google Cloud
您可以考虑仅允许使用 us-central1 区域的消息存储政策。
- 在
us-east1中运行的发布者客户端发出Publish请求。 - 请求路由到
us-east1中的 Pub/Sub 服务器。 - 请求路由到消息存储政策允许使用的最近区域 (
us-central1),而不是将数据存储在us-east1中。 - Pub/Sub 将发布的消息存储在
us-central1中,并将消息从该位置转发给订阅者。
此机制会影响请求延迟时间和整体系统可用性。由于请求会遍历更多网络链接,因此需要更长的时间才能完成,并且失败的可能性相对较高。这也意味着订阅者可能会稍微晚一点看到消息,因为消息在调度之前必须前往允许使用的最近区域。如果政策允许使用单一区域,但发布者应用在多个区域运行,则该分布式应用的可用性仅与允许使用的该单一区域相同。
后续步骤
- 如需了解如何使用全局端点或定位端点,请参阅 Pub/Sub API 概览。