如果您将消息发布到全局 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
。此标志控制以下内容:
在消息存储政策不允许的区域中收到的发布、拉取和 streamPull 请求会被拒绝并显示
FAILED_PRECONDITION
错误。推送订阅的传送仅在允许的 Cloud 区域内处理。在某些情况下,此限制可能会完全暂停推送订阅的消息传送。当推送订阅由于推送位置受到消息存储位置、允许的区域和导出资源位置等因素组合过度限制而进入这种状态时,此状态在 Stackdriver 中变得可见。
新主题的消息存储政策
如果您在创建主题时未指定消息存储政策,则系统会根据有效的资源位置限制组织政策自动确定消息存储政策。如果没有任何组织政策,则允许使用所有区域。
同样,在没有指定消息存储政策的情况下,
enforceInTransit
标志将根据有效的对 Pub/Sub 消息强制执行传输区域组织政策来确定。如需详细了解此组织政策,请参阅组织政策限制条件。如果您在创建主题时指定消息存储政策,该储政策可以仅包含有效资源位置限制组织政策所允许的区域。如果没有任何组织政策,则消息存储政策可以包含任何区域。
现有主题的消息存储政策
更新组织政策后,相应的更改不会自动传播到现有主题。因此,现有主题的消息存储政策可能与最新的组织政策不同步。如需了解详情,请参阅管理组织政策与主题政策之间的差异。
更新主题的消息存储政策后,所做的更改不会传播到已发布的消息。已根据旧政策存储的消息不会更改为与更新后的政策一致。相应的更改仅适用于更新后发布的消息。
例外情况
政策会指定允许使用的 Google Cloud 区域名称列表。因此,系统不支持以下两项:
- 排除列表
- 地区或多区域位置
如果您发布带有排序键的消息,并且消息存储政策排除最近的地区,则 Pub/Sub 服务将返回错误。
配置消息存储政策
您可以通过以下两种方式为主题配置消息存储政策,包括:
- 使用组织政策设置消息存储政策。
- 在创建主题时配置消息存储政策。
使用组织政策设置消息存储政策
控制台
如需配置适用于多个主题的消息存储政策,请设置资源位置限制组织政策。
转到 Identity and Access Management 控制台中的组织政策页面。
选择要设置组织政策的资源层次结构节点(组织、文件夹或项目)。
在过滤条件中,输入 Resource Location Restriction。
点击 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 控制台中,打开主题详情页面。
选择主题。
在信息面板中,选择存储政策标签页。
默认情况下,此面板可能处于收起状态。如果面板已收起,请点击显示信息面板。
您的存储政策会显示在面板中,并且存在的所有差异。
如果存在任何差异,信息面板会显示三个选项,用于将主题存储政策与组织政策同步,其中包括:
Topics 允许存储在不允许的位置。
更新后,仅允许存储在政策允许的位置。
主题不允许在某些允许的位置存储。
更新后,允许存储在政策允许的所有位置。
在不允许和允许的位置上,主题已过时。
更新后,允许存储在政策允许的位置。
选择适当的选项来解决您的问题。
点击更新主题。
此时系统会打开同步到组织存储政策对话框。
点击更新主题。
监控和问题排查
为了帮助您了解消息数据的存储位置,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 概览。