配置消息存储政策

如果您将消息发布到全局 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 服务将返回错误。

配置消息存储政策

您可以通过以下两种方式为主题配置消息存储政策:

  • 使用组织政策设置消息存储政策。
  • 在创建主题时配置消息存储政策。

使用组织政策设置消息存储政策

控制台

如需配置适用于多个主题的消息存储政策,请设置资源位置限制组织政策。

  1. 前往 Identity and Access Management 控制台中的组织政策页面。

    转到组织政策

  2. 选择要设置组织政策的资源层次结构节点(组织、文件夹或项目)。

  3. 在过滤条件中,输入资源位置限制

  4. 点击 Google Cloud - 资源位置限制

  5. 点击修改

  6. 根据需要添加或移除区域。

    您创建的所有新主题都会继承这些设置。更改不会自动传播到现有主题。如需更新现有主题,您必须运行更新操作

如需详细了解组织政策,请参阅管理 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 参考文档。

更新消息存储政策

控制台

  1. 在 Google Cloud 控制台中,打开主题详细信息页面。

    前往“主题详细信息”

  2. 选择要更新的主题。