Firebase 账单中列出的计费对象包括您存储在数据库中的数据以及在 OSI 模型会话层(第 5 层)的所有出站网络流量。存储费用为 $5/GB/月,每天估算一次。费用结算不受数据库位置的影响。出站流量包括所有数据库操作产生的连接开销和加密开销,以及通过数据库读取操作下载的数据。数据库读取和写入都可能在结算时产生连接费用。进出数据库的所有流量(包括被安全规则拒绝的操作)都会产生可计费的费用。
以下是计费流量的一些常见示例:
- 下载的数据:当客户端从您的数据库获取数据时,Firebase 会针对下载的数据收费。这部分费用通常占到了带宽费用的大部分,但并不是产生结算费用的唯一因素。
- 协议开销:在服务器与客户端之间建立和维护会话需要一些额外的流量。根据底层协议,这部分流量可能包括:Firebase Realtime Database 的实时协议开销、WebSocket 开销和 HTTP 标头开销。每次建立连接时,这部分开销与所有 SSL 加密开销都会一并计入连接费用。虽然单个请求占用的带宽并不多,但如果您的载荷很小或者您频繁地进行短暂连接,那么这部分开销累积起来就可能会占到您结算费用中的很大一部分。
- SSL 加密开销:要实现安全连接,就需要进行 SSL 加密,这就会产生 SSL 加密开销。平均来讲,初始握手的开销大约为 3.5KB,每条传出消息的 TLS 记录标头大约为几十个字节。对于大多数应用来说,这部分费用只占结算费用的一小部分。但是,如果您的具体使用情形需要大量的 SSL 握手,这部分费用所占的比例可能会较高。例如,不支持 TLS 会话票证的设备可能需要大量的 SSL 连接握手。
- Firebase 控制台数据:虽然这部分数据产生的费用通常只占 Realtime Database 费用的一小部分,但 Firebase 会对在 Firebase 控制台中读取和写入的数据收取费用。
估算计费用量
如需查看当前的 Realtime Database 连接和数据用量,请查看 Firebase 控制台中的用量标签页。您可以查看当前结算周期、过去 30 天或过去 24 小时的用量。
Firebase 会显示以下指标的用量统计信息:
- 连接数:同时连至您的数据库且当前处于打开状态的实时连接数。包括以下实时连接:WebSocket、长轮询和 HTML 服务器发送的事件,但不包括 RESTful 请求。
- 存储量:您的数据库中存储的数据量。不包括 Firebase 托管或通过其他 Firebase 产品存储的数据。
- 下载量:从您的数据库下载的所有字节,包括协议和加密开销。
- 负载:此图表显示了给定的 1 分钟间隔内,在处理请求时数据库的使用率。当数据库使用率接近 100% 时,就可能会出现性能问题。
优化数据用量
您可以采取一些最佳做法来优化数据库用量,节省带宽费用。
- 使用原生 SDK:尽可能使用与应用对应的平台相适应的 SDK,而不是 REST API。SDK 可使连接保持打开状态,从而减少通常会因使用 REST API 而产生的 SSL 加密费用。
- 检查是否存在错误:如果您的带宽费用高得异乎寻常,请核实您的应用同步数据的量或频率是否超出了原本的预期。要找出问题根源,可使用性能分析器工具来衡量您的读取操作,并在 Android SDK、Objective-C SDK 和 Web SDK 中开启调试日志记录功能。检查您的应用中的后台和同步进程,确保一切符合预期。
- 减少连接数:如果可能,尝试优化连接带宽。频繁、小负载的 REST 请求可能比使用原生 SDK 的单个持续连接产生更高的费用。如果您确实需要使用 REST API,不妨考虑使用 HTTP keep-alive 或服务器发送的事件,这样有助于降低 SSL 握手产生的费用。
- 使用 TLS 会话票证:通过签发 TLS 会话票证来减少恢复连接时的 SSL 加密开销。此方法特别适合需要频繁、安全地连接到数据库的情况。
- 将查询编入索引:将数据编入索引可减少查询所用的总带宽,这样既有助于降低费用,又能提高数据库性能,一举两得。您可使用性能分析器工具在数据库中找出未编入索引的查询。
- 优化侦听器:添加查询以限制您的侦听操作返回的数据,并使用仅下载数据更新的侦听器。例如,使用
on()
而不是once()
。另外,将您的侦听器部署在路径中尽可能深的地方,以限制它们同步的数据量。 - 降低存储费用:运行定期清理作业并减少数据库中的重复数据。
- 使用规则:禁止对数据库执行可能产生高额费用的未授权操作。例如,使用 Firebase Realtime Database Security Rules 可以避免恶意用户反复下载整个数据库的情况。详细了解如何使用 Firebase Realtime Database 规则。
适合您的应用的最佳优化方案取决于具体的使用情形。上文并未列出所有的最佳做法,您可以在我们的 Slack 频道或 Stack Overflow 上找到 Firebase 专家提供的更多建议和提示。