本文档介绍了如何发布消息。
发布者应用会创建消息,然后将其发送到主题。Pub/Sub 提供至少一次消息传送并尽力而为 对现有订阅者进行排序。
发布者应用的一般流程如下所示:
- 创建一条包含您的数据的消息。
- 向 Pub/Sub 服务器发送请求以发布消息 与指定主题相关联。
准备工作
在配置发布工作流程之前,请确保您已完成以下操作 任务:
所需的角色
如需获取向主题发布消息所需的权限,
请让管理员授予您
该主题的 Pub/Sub Publisher (roles/pubsub.publisher
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您需要拥有其他权限才能 创建或更新主题和订阅。
消息格式
消息由包含消息数据和元数据的字段组成。在消息中至少指定以下内容之一:
Pub/Sub 服务将以下字段添加到消息中:
- 主题专属的消息 ID
- Pub/Sub 服务接收消息的时间的时间戳
如需详细了解消息,请参阅消息格式。
发布消息
您可以使用 Google Cloud 控制台、Google Cloud CLI、Pub/Sub API 和客户端库发布消息。客户端库可以异步发布消息。
以下示例演示了如何将消息发布到主题。
控制台
要发布消息,请执行以下操作
在 Google Cloud 控制台中,前往 Pub/Sub 主题页面。
点击主题 ID。
在主题详情页面的消息下,点击发布消息。
在消息正文字段中,输入消息数据。
点击发布。
gcloud
要发布消息,请使用 gcloud pubsub topics publish 命令:
gcloud pubsub topics publish TOPIC_ID \ --message=MESSAGE_DATA \ [--attribute=KEY="VALUE",...]
请替换以下内容:
- TOPIC_ID:主题的 ID
- MESSAGE_DATA:包含消息数据的字符串
- KEY:消息属性的键
- VALUE:消息属性的键对应的值
REST
要发布消息,请发送如下所示的 POST 请求:
POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID:publish Content-Type: application/json Authorization: Bearer $(gcloud auth application-default print-access-token)
请替换以下内容:
- PROJECT_ID:包含主题的项目的 ID
- TOPIC_ID:主题的 ID
在请求正文中指定以下字段:
{ "messages": [ { "attributes": { "KEY": "VALUE", ... }, "data": "MESSAGE_DATA", } ] }
请替换以下内容:
- KEY:消息属性的键
- VALUE:消息属性的键对应的值
- MESSAGE_DATA:包含消息数据的 base64 编码字符串
消息必须包含非空的数据字段或至少一个特性。
如果请求成功,则响应是一个包含消息 ID 的 JSON 对象。以下是包含消息 ID 的响应:
{ "messageIds": [ "19916711285", ] }
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
发布消息后,Pub/Sub 服务将消息 ID 返回给发布者。
使用属性发布消息
您可以将自定义属性作为元数据嵌入 Pub/Sub 消息中。 属性用于提供有关消息的更多信息 如优先级、出发地或目的地 属性还可用于过滤订阅中的消息。
在邮件中使用属性时,请遵循以下准则:
属性可以是文本字符串或字节字符串。
每条消息最多可以有 100 个属性。
属性键不得以
goog
开头,且不得超过 256 个字节。属性值不得超过 1024 个字节。
消息架构可通过以下方式表示:
{ "data": string, "attributes": { string: string, ... }, "messageId": string, "publishTime": string, "orderingKey": string }
对于发布端重复项,您可能会看到不同的 publishTime
值
相同的客户端原始消息,即使使用相同的 messageId
也是如此。
PubsubMessage
JSON 架构作为
REST 和
RPC
文档。您可以为事件时间戳使用自定义属性。
以下示例演示了如何发布带有属性的消息 。
控制台
如需发布带有属性的消息,请按以下步骤操作:
在 Google Cloud 控制台中,前往主题页面。
点击要为其发布消息的主题。
在主题详情页面中,点击消息。
点击发布消息。
在消息正文字段中,输入消息数据。
在消息属性下,点击添加属性。
输入键值对。
根据需要添加更多属性。
点击发布。
gcloud
gcloud pubsub topics publish my-topic --message="hello" \ --attribute="origin=gcloud-sample,username=gcp,eventTime='2021-01-01T12:00:00Z'"
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
使用排序键发布消息
要在订阅者客户端中按顺序接收消息,您必须配置 发布具有排序键的消息。
如需了解对键进行排序的概念,请参阅对消息进行排序。
下面列出了为发布商提供有序消息服务的关键注意事项。 客户:
在单个发布商客户中下单:如果使用单个发布商客户 在同一区域中发布具有相同排序键的消息, 订阅方客户端会按照 已发布。例如,如果一个发布商客户 带有排序键 A(订阅方客户端)的消息 1、2 和 3 会按 1、2、3 的顺序接收它们
在多个发布者客户端中排序:接收消息的顺序 它们的顺序一致 即使有多个发布商客户使用 相同的排序键。然而,发布商客户本身 这个订单
例如,如果发布商客户 X 和 Y 使用排序键 A 发布消息,且 X 的消息由 Pub/Sub 在 Y 之前,则所有订阅者客户端 先接收 X 的消息,然后再收到 X 的消息。如果不同产品之间的消息顺序 还是发布商客户,这些客户都必须实施额外的 协调机制,以确保它们不会使用 相同的排序键。例如,锁定服务 可用于在发布时保留排序键的所有权。
跨地区订购:有序送达保证仅适用于 当排序键的发布位于同一区域时。如果您的发布商 应用会将排序键相同的消息发布到不同的 区域,则无法针对这些发布强制执行顺序。订阅者可以连接到任何区域,并且订购保证仍然有效。
当您在 Google Cloud 中运行应用时,默认情况下,应用会连接到同一区域中的 Pub/Sub 端点。因此,在两个区域中的单个区域内运行应用 Google Cloud 通常会确保您与 区域。
当您在 Google Cloud 外部 还是在多个区域,您可以保证 连接到单个区域时, 配置 Pub/Sub 客户端。的所有位置端点 Pub/Sub 指向单个区域。要详细了解 位置端点,请参阅 Pub/Sub 端点。 如需查看 Pub/Sub 的所有位置端点的列表,请参阅 位置端点列表。
发布失败:使用排序键发布失败时,会排入队列 发布方中具有相同排序键的消息失败,包括 Future 消息 此排序键的发布请求。您必须通过以下应用继续发布: 发生此类故障时对键进行排序。有关恢复 发布操作,请参阅使用排序键重试请求。
您可以使用 Google Cloud 控制台、 Google Cloud CLI、Pub/Sub API 或客户端库。
控制台
如需发布带有属性的消息,请按以下步骤操作:
在 Google Cloud 控制台中,前往主题页面。
点击要为其发布消息的主题。
在主题详情页面中,点击消息。
点击发布消息。
在消息正文字段中,输入消息数据。
在消息排序字段中,输入排序键。
点击发布。
gcloud
如需发布带有排序键的消息,请使用 gcloud pubsub topics publish
命令和 --ordering-key
标志:
gcloud pubsub topics publish TOPIC_ID \ --message=MESSAGE_DATA \ --ordering-key=ORDERING_KEY
请替换以下内容:
- TOPIC_ID:主题的 ID
- MESSAGE_DATA:包含消息数据的字符串
- ORDERING_KEY:带有排序键的字符串
REST
如需发布带有排序键的消息,请发送如下所示的 POST 请求:
POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID:publish Content-Type: application/json Authorization: Bearer $(gcloud auth application-default print-access-token)
请替换以下内容:
- PROJECT_ID:包含主题的项目的 ID
- TOPIC_ID:主题的 ID
在请求正文中指定以下字段:
{ "messages": [ { "attributes": { "KEY": "VALUE", ... }, "data": "MESSAGE_DATA", "ordering_key": "ORDERING_KEY", } ] }
请替换以下内容:
- KEY:消息属性的键
- VALUE:消息属性的键对应的值
- MESSAGE_DATA:包含消息数据的 base64 编码字符串
- ORDERING_KEY:带有排序键的字符串
消息必须包含非空的数据字段或至少一个特性。
如果请求成功,则响应是一个包含消息 ID 的 JSON 对象。以下是包含消息 ID 的响应:
{ "messageIds": [ "19916711285", ] }
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
监控发布商
Cloud Monitoring 提供了多种指标来监控主题。
要监控主题并使发布者保持健康状况,请参阅 维护良好的发布商环境。
后续步骤
如需限制 Pub/Sub 存储消息数据的位置,请参阅 限制 Pub/Sub 资源位置。
如需发布具有架构的消息,请参阅架构概览。
要了解如何配置高级递送选项,请参阅以下内容: