如果您将消息发布到全局 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
。此标志用于控制以下内容:
如果在消息存储政策中不允许的区域收到发布、拉取和 streamingPull 请求,系统会拒绝这些请求并返回
FAILED_PRECONDITION
错误。推送订阅的传送仅在允许的 Cloud 区域内处理。在某些情况下,此限制可能会完全暂停推送订阅的消息传送。如果推送位置因消息存储位置、允许的区域和导出资源位置等多种因素的组合而受到过多限制,导致推送订阅进入此状态,此状态就会在 Stackdriver 中显示。
新主题的消息存储政策
如果您在创建主题时未指定消息存储政策,则系统会根据有效的资源位置限制组织政策自动确定消息存储政策。如果没有任何组织政策,则允许使用所有区域。
同样,如果未指定消息存储政策,系统会根据有效的对 Pub/Sub 消息强制执行传输中区域组织政策确定
enforceInTransit
标志。如需详细了解此组织政策,请参阅组织政策限制条件。如果您在创建主题时指定消息存储政策,该储政策可以仅包含有效资源位置限制组织政策所允许的区域。如果没有任何组织政策,则消息存储政策可以包含任何区域。
现有主题的消息存储政策
更新组织政策后,相应的更改不会自动传播到现有主题。因此,现有主题的消息存储政策可能与最新的组织政策不同步。如需了解详情,请参阅管理组织政策与主题政策之间的差异。
更新主题的消息存储政策后,相应的更改不会传播到已发布的消息。已根据旧政策存储的消息不会更改为与更新后的政策一致。相应的更改仅适用于更新后发布的消息。
例外情况
政策会指定允许使用的 Google Cloud 区域名称列表。因此,系统不支持以下两项:
- 排除列表
- 地区或多区域位置
如果您发布带有排序键的消息,并且消息存储政策排除最近的地区,则 Pub/Sub 服务将返回错误。
配置消息存储政策
您可以通过以下两种方式为主题配置消息存储政策:
- 使用组织政策设置消息存储政策。
- 在创建主题时配置消息存储政策。
使用组织政策设置消息存储政策
控制台
如需配置适用于多个主题的消息存储政策,请设置资源位置限制组织政策。
前往 Identity and Access Management 控制台中的组织政策页面。
选择要为其设置组织政策的资源层次结构节点(组织、文件夹或项目)。
在过滤条件中,输入资源位置限制。
点击 Google Cloud - 资源位置限制。
点击修改。
根据需要添加或移除区域。
您创建的所有新主题都会继承这些设置。更改不会自动传播到现有主题。如需更新现有主题,您必须运行更新操作。
如需详细了解组织政策,请参阅管理 Google Cloud 资源。
在创建主题时配置消息存储政策
控制台
使用 Google Cloud 控制台时,您无法在创建主题时配置消息存储政策。而是所有新主题都会自动继承您的资源位置限制组织政策。
不过,创建主题后,您可以在控制台中使用更新操作更改其消息存储政策。
gcloud CLI
如需创建具有特定消息存储政策的主题,请使用带有 --message-storage-policy-allowed-regions
标志的 gcloud pubsub topics create
命令:
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
如需更新位于特定区域的主题的消息存储政策,请运行带有 --message-storage-policy-allowed-regions
标志的 gcloud pubsub topics update
命令:
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 之外运行或者在该政策不允许使用的区域中运行,则该政策会影响可用性。在消息存储政策允许使用的区域集内运行发布商客户端的用户不会看到服务的延迟时间或可用性有什么变化。
如需了解这些影响,有必要考虑发布请求的路由方式。通常,Pub/Sub 会尝试将消息存储在尽可能靠近请求来源的位置。源自 Google Cloud 的请求通常会绑定到同一区域中的 Pub/Sub 实例。如果发布者位于单个区域,则在消息存储政策中仅仅添加更多区域并不会提高可用性。从 Google Cloud 外部发布时,需要额外的路由层来将请求发送到提供 Pub/Sub 服务的附近 Google Cloud 区域。
您可以考虑仅允许使用 us-central1
区域的消息存储政策。
- 在
us-east1
中运行的发布者客户端发出Publish
请求。 - 请求路由到
us-east1
中的 Pub/Sub 服务器。 - 请求路由到消息存储政策允许使用的最近区域 (
us-central1
),而不是将数据存储在us-east1
中。 - Pub/Sub 将发布的消息存储在
us-central1
中,并将消息从该位置转发给订阅者。
此机制会影响请求延迟时间和整体系统可用性。由于请求会遍历更多网络链接,因此需要更长的时间才能完成,并且失败的可能性相对较高。这也意味着订阅者可能会稍微晚一点看到消息,因为消息在调度之前必须前往允许使用的最近区域。如果政策允许使用单一区域,但发布者应用在多个区域运行,则该分布式应用的可用性仅与允许使用的该单一区域相同。
后续步骤
- 如需了解如何使用全球或位置端点,请参阅 Pub/Sub API 概览。