python - 获取 Google Cloud PubSub 中单条消息的大小
问题描述
我有一个设置,我将消息发布到Google Cloud PubSub服务。
我希望获得要发布到 PubSub 的每条消息的大小。因此,为此,我确定了以下方法(注意:我使用 Python 客户端进行发布和订阅,遵循其文档中提供的逐行实现):
- 使用“监控”功能从 Google Cloud Console 查看消息计数
- 创建一个请求订阅客户端并
message.size
在回调函数中查看从请求主题中提取的消息的大小。 - 通过根据PubSub消息模式将消息转换为 JSON并使用
sys.getsizeof()
对于我使用 Python 发布者客户端发布的如下示例消息:
{
"data": 'Test_message',
"attributes": {
'dummyField1': 'dummyFieldValue1',
'dummyField2': 'dummyFieldValue2'
}
}
,我得到大小为 101 作为message.size
订阅客户端中以下回调函数的输出:
def callback(message):
print(f"Received {message.data}.")
if message.attributes:
print("Attributes:")
for key in message.attributes:
value = message.attributes.get(key)
print(f"{key}: {value}")
print(message.size)
message.ack()
而 Cloud Console Monitoring 上显示的大小约为 79 B。
所以这些是我的问题:
- 为什么同一条消息的大小不同?
message.size
以字节为单位的输出?- 如何在使用 python 客户端发布之前查看消息的大小?
- 如何在 Cloud Console 上查看单个消息的大小,而不是在给定时间范围内的大小聚合度量,我可以在“监控”部分找到?
解决方案
关于您在发布前查看消息大小的第三个问题,计费消息大小是消息数据、属性(键加值)、时间戳的 20 个字节和message_id
. 请参阅Cloud Pub/Sub 定价指南。请注意,无论消息大小如何,至少 1000 字节都是可计费的,因此如果您的消息可能小于 1000 字节,那么拥有良好的批处理设置很重要。是在message_id
服务器端分配的,不保证一定大小,但它由发布调用作为未来返回,因此您可以查看示例。这应该允许您在发布者客户端中获得相当准确的消息成本估计。请注意,您还可以使用监控客户端库以从 Python 客户端中读取 Cloud Monitoring 指标。
关于您的第四个问题,无法从分布指标中提取单个数据点(除非您在查询的时间段内仅发布了一条消息,在这种情况下,平均值会告诉您该消息的大小)。
推荐阅读
- android - Android Firebase 存储:用户无权访问此对象
- pandas - 如何将时间序列数据集转换为熊猫数据框
- java - 从 3 个不同的单声道创建实体
- ionic-framework - 在 Ionic 4 中为 ion-button 添加 webkit-backface-visibility
- jsp - 无法包含来自应用程序外部位置的 jsp 文件
- jquery - jQuery - 从数组中获取元素并以相同的顺序输入每个连续的 td
- r - R - 根据列中的值将一列分成两部分
- swift - 在 Tabbar 项目上设置用户的个人资料图片
- java - Intellij IDEA中的步骤导航问题与黄瓜4.6.0
- c++ - CGAL_USE_BASIC_VIEWER