如果您将消息发布到全局 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错误。如果客户端在 Google Cloud 允许的区域之一(例如 Compute Engine 虚拟机)内运行,则可以使用全局端点。客户端的请求会在允许的区域内进行本地路由。 客户端还可以使用以允许的区域为目标的位置端点或区域端点。
如果客户端在不允许的区域内运行 Google Cloud 或在 Google Cloud之外运行,则必须使用定位或区域端点,该端点以允许的区域列表中的区域为目标。
推送订阅的传送仅在允许的 Cloud 区域内处理。在某些情况下,此限制可能会完全暂停推送订阅的消息递送。如果推送订阅因推送位置受到多种因素(例如消息存储位置、允许的区域和导出资源位置)的过度限制而进入这种状态,则该状态会在 Stackdriver 中显示。
新主题的消息存储政策
如果您在创建主题时未指定消息存储政策,则系统会根据有效的资源位置限制组织政策自动确定消息存储政策。如果没有任何组织政策,则允许使用所有区域。
同样,在未指定消息存储政策的情况下,系统会根据有效的对 Pub/Sub 消息强制执行传输中区域组织政策来确定
enforceInTransit标志。如需详细了解此组织政策,请参阅组织政策限制条件。如果您在创建主题时指定消息存储政策,该储政策可以仅包含有效资源位置限制组织政策所允许的区域。如果没有任何组织政策,则消息存储政策可以包含任何区域。
现有主题的消息存储政策
更新组织政策后,相应的更改不会自动传播到现有主题。因此,现有主题的消息存储政策可能与最新的组织政策不同步。如需了解详情,请参阅管理组织政策与主题政策之间的差异。
更新主题的消息存储政策后,相应的更改不会传播到已发布的消息。已根据旧政策存储的消息不会更改为与更新后的政策一致。相应的更改仅适用于更新后发布的消息。
例外情况
政策会指定允许使用的 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 控制台中,打开主题详细信息页面。
选择要更新的主题。