我一直在为一个应用程序进行原型设计,该应用程序报告不常见的设备生成事件(例如地理围栏转换)和用户对云功能的请求。似乎数据库触发器是一种安全,简单且低成本的方法来调用云功能。应用程序将事件/请求参数打包到一个小对象(<500字节)中,并将对象写入Firebase数据库,从而触发所需的云功能。这很有效,并提供了预期的好处。
当我扩展测试并查看Firebase控制台的数据库使用情况面板时,我发现下载数据的大小远远高于我的预期。我的客户端代码没有监听器;它只写数据。我检查了云函数只读取了预期的小对象,代码中的单个查询是针对在安全规则中指定了索引的数据。
然后我开始查看Android Device Monitor为特定客户端事件提供的网络统计信息。数据显示,当数据库连接不存在并且需要建立以写入服务器时,将接收大约4500字节的数据。我对HTTPS知之甚少,我认为这是与数据库连接相关的Firebase开销,并考虑了其他选项。
接下来,我尝试使用自己的OkHttpClient连接编写触发器对象到REST API。当我看到为写入500字节对象而收到相同的4000多个字节时,我意识到接收到的数据必须是证书和密钥的HTTPS握手,并且很可能是不可避免的。
我的问题是:
admin.database()
访问Firebase数据库,那么该SDK是否使用REST API实现?在这种情况下,问题#2中的问题是否也适用于那里?正如我在帖子开头所指出的那样,我正在处理的事件/用户请求很少发生。几乎总是这样的情况:当需要编写数据来报告事件时,数据库连接将不存在并且需要建立。如果对问题#2的回答是肯定的,则认为小于500字节的操作的成本实际上将是4000+字节。对于这个用例,将事件报告给云函数的成本最低的方法似乎是使用HTTP triggers,而不是数据库触发器。
更新
如果我更彻底地搜索了文档,我就不需要发布这个问题了。它全部包含在Database Billing and Profiler documentation:
中
协议开销:建立和维护会话需要服务器和客户端之间的一些额外流量。取决于 底层协议,此流量可能包括:Firebase Realtime 数据库的实时协议开销,WebSocket开销和HTTP 标头开销。每次建立连接时,这个开销, 结合任何SSL加密开销,有助于 连接成本。虽然这通常不是很多 带宽,如果您的有效载荷微小或您制造,它可能是巨大的 频繁,短暂的联系。
SSL加密开销:安全连接所需的SSL加密开销会产生相关成本。平均来说,这个 初始握手的成本约为3.5KB 每个传出消息上的TLS记录头大约40B。对于 大多数应用程序,这只是您账单的一小部分。但是,这个 如果您的具体案例需要很多,可能会成为很大比例 SSL握手例如,不支持TLS会话的设备 票证可能需要大量的SSL连接握手。
答案 0 :(得分:0)
您的问题中有很多项目细节,Stack Overflow可能不是最佳答案。我将在下面提供一些简单的答案,但建议您reach out to Firebase support提供有关故障排除的个性化帮助。
HTTPS握手带宽是可计费流量,应显示在Firebase控制台的数据库使用情况面板中。我不知道开销是多少。
Admin SDK for Node使用套接字连接到Firebase数据库。它不使用REST API。协商HTTPS / WebSocket连接时的带宽也是可计费流量。
在创建新容器时,会发生从云功能到数据库的此连接的构建。这可以在项目的第一次部署之后,在一段时间不活动之后,或者由于高活动而需要扩展云功能。