【发布时间】:2017-12-01 02:19:40
【问题描述】:
我一直在设计一个应用程序原型,该应用程序报告不经常发生的设备生成事件(例如地理围栏转换)和用户对云功能的请求。似乎数据库触发器将是调用云功能的一种安全、简单且低成本的方法。该应用程序将事件/请求参数打包成一个小对象(
当我扩大测试规模并查看 Firebase 控制台的数据库使用面板时,我发现下载数据的大小远高于我的预期。我的客户端代码没有监听器;它只写入数据。我检查了云函数只读取预期的小对象,并且代码中的单个查询是针对具有安全规则中指定的索引的数据。
然后我开始查看Android Device Monitor 为特定客户端事件提供的网络统计信息。数据显示,当数据库连接不存在且需要建立写入服务器时,大约会收到 4500 字节的数据。由于对 HTTPS 知之甚少,我认为这是与数据库连接相关的 Firebase 开销,并考虑了其他选项。
接下来,我尝试使用我自己的 OkHttpClient 连接到 REST API 来编写我的触发器对象。当我看到写入 500 字节对象时接收到相同的 4000+ 字节时,我意识到接收到的数据必须是证书和密钥的 HTTPS 握手,并且可能是不可避免的。
我的问题是:
- 与 Firebase 数据库服务器建立连接时客户端收到的 4000 多个字节是否主要用于 HTTPS 连接的安全数据交换?
- 这些字节是否被视为“下载数据”并因此包含在 Firebase 控制台上显示的使用总量和计费计算中?
- 如果云函数使用
admin.database()访问 Firebase 数据库,该 SDK 是否使用 REST API 实现?在这种情况下,问题 #2 中的问题是否也适用于那里?
正如我在帖子开头所指出的,我正在处理的事件/用户请求并不常见。几乎总是这样,当需要写入数据来报告事件时,DB 连接将不存在并且需要建立。如果问题 #2 的答案是肯定的,那么被认为小于 500 字节的操作的成本实际上将是 4000+ 字节。对于这个用例,将事件报告给云函数的成本最低的方法似乎是使用HTTP triggers,而不是数据库触发器。
更新:
如果我更彻底地搜索了文档,我就不需要发布这个问题了。这一切都在Database Billing and Profiler documentation:
协议开销:服务器和客户端之间的一些额外流量是建立和维护会话所必需的。根据 底层协议,此流量可能包括: Firebase Realtime 数据库的实时协议开销、WebSocket 开销和 HTTP 标头开销。每次建立连接时,这个开销, 结合任何 SSL 加密开销,有助于 连接费用。虽然这通常不是大量的 带宽,如果您的有效载荷很小或者您制作 频繁的短连接。
SSL 加密开销:存在与安全连接所需的 SSL 加密开销相关的成本。平均而言,这 初始握手的成本约为 3.5KB,并且 每个传出消息上的 TLS 记录标头大约为 40B。为了 大多数应用程序,这只是您账单的一小部分。然而,这 如果您的具体情况需要很多,可能会占很大比例 SSL 握手。例如,不支持 TLS 会话的设备 票证可能需要大量 SSL 连接握手。
【问题讨论】:
标签: android firebase firebase-realtime-database google-cloud-functions