为啥仅将数据写入 Firebase 数据库的下载成本为 12kB/分钟?

Posted

技术标签:

【中文标题】为啥仅将数据写入 Firebase 数据库的下载成本为 12kB/分钟?【英文标题】:Why does only writing data to Firebase Database cost me 12kB/minute in downloads?为什么仅将数据写入 Firebase 数据库的下载成本为 12kB/分钟? 【发布时间】:2021-12-29 04:51:45 【问题描述】:

我在运行 Node-red 环境的 IoT 设备上使用原生 Firebase javascript SDK's

我的代码仅包含在 Firebase 上的 WRITEDELETE 操作 实时数据库数据。 物联网设备开启时,连接也会建立。 但除此之外,我从来没有 READ 任何来自 Firebase Realtime 的数据 数据库。

尽管我没有READ 任何数据,但当我今天早上查看 Firebase 控制台时,我看到了一张图表,显示我恒定的12kB/minute 下载和1 峰值连接。我虽然有些机器人连接到我的数据库。所以我关闭了我的 IoT 设备,我在图表中看到连接也从 1 变为 0(所以我确定只有我的 IoT 设备连接到数据库)。

下载量也从12kB/minute 变为0kB/minute

我将在下面添加我的代码 - 但我很困惑我做了什么数据 如果我没有使用任何ononChildAddedonValue 等,则下载。 方法。 我是 Firebase 数据库的新手,所以如果我是新手 错误只是为我指明了正确的方向。

当我只使用 READ 方法时,为什么我的 IoT 设备会下载任何数据?


物联网设备开启时运行的代码:

//Load data from Global contexta
const app = global.get('app');
const database = global.get('database');
const firestore = global.get('firestore');
const auth = global.get('auth');


const firebaseConfig = 
  //my credentials 
;

//Set up Firebase
const fb_app = app.initializeApp(firebaseConfig);
const fb_db = database.getDatabase(); //kdybychom měli vice projektu tak app dame do parametru
const fb_ft = firestore.getFirestore();
const fb_auth = auth.getAuth();

//Save the database reference to Global context
global.set('fb_app', fb_app);
global.set('fb_db', fb_db);
global.set('fb_ft', fb_ft);
global.set('fb_auth', fb_auth);

每 1 秒写入一次数据的代码:

const fb = global.get('database');
const fb_db = global.get('fb_db');

var timestamp = Math.round(msg.payload / 1000);
var UID = 'uid1';

var a1 = 0  + Math.floor(Math.random() * 100);
var p1 = 50 + Math.floor(Math.random() * 20);
var t1 = 20 + Math.floor(Math.random() * 20);

//Send data to Firebase
const ref = fb.ref(
    fb_db,
    'device_realtime/' + UID + '/' + timestamp.toString()
);

fb.set(ref, 
    a1: a1,
    p1: p1,
    t1: t1
);

删除超过 60 秒的数据的代码:

const fb = global.get('database');
const fb_db = global.get('fb_db');

var timestamp1 = Math.round(msg.payload / 1000) - 60;
var timestamp2 = Math.round(msg.payload / 1000) - 61;
var UID = 'uid1';

//Delete old data from firebase
var reference1 = fb.ref(
    fb_db,
    'device_realtime/' + UID + '/' + timestamp1.toString()
);

var reference2 = fb.ref(
    fb_db,
    'device_realtime/' + UID + '/' + timestamp2.toString()
);

fb.remove(reference1)
fb.remove(reference2)

每 1 分钟写入一次数据的代码:

const fb = global.get('database');
const fb_db = global.get('fb_db');

var timestamp = Math.round(msg.payload / 1000);
var UID = 'uid1';

var a1 = 0  + Math.floor(Math.random() * 100);
var p1 = 50 + Math.floor(Math.random() * 20);
var t1 = 20 + Math.floor(Math.random() * 20);

//Send data to Firebase
const ref = fb.ref(
    fb_db,
    'device_trends/' + UID + '/' + timestamp.toString()
);

fb.set(ref, 
    a1: a1,
    p1: p1,
    t1: t1
);

整个流程的屏幕截图:

【问题讨论】:

也许对您的写入的“OK”响应是 200 字节? 我能否以某种方式关闭OK 响应?如果这是真的 - 为什么 Firebase 文档中没有提到它? 可能是因为当您使用 Firebase 免费获得 10 GiB/月的网络出口时,它绝对可以忽略不计,超过 0.12 美元/GiB。 10 GiB 为您提供,呃……每月 5000 万次此类响应。 1GB/month 的文档中,超出10GB/month 免费配额的费用是1 美元,不是吗?还是我错过了什么?是的,我并不害怕我无法为此支付 - 我只是好奇,想了解这种行为:D 我可能会将光标悬停在“下载”标题旁边的小 (?) 上 - 它可能会告诉您该数字的真正含义。我只看出口价格;我假设“实时数据库 - 已下载 GB”(1 美元/额外 GB)用于从查询中下载的实际结果数据... 【参考方案1】:

在 cmets 中展开讨论:

该下载数据考虑了来自数据库的所有出站流量,包括例如对写入的任何可能的 OK 响应。

根据引用的数字和一些餐巾纸数学,似乎每次写入对应于大约 200 字节的下载数据。

【讨论】:

以上是关于为啥仅将数据写入 Firebase 数据库的下载成本为 12kB/分钟?的主要内容,如果未能解决你的问题,请参考以下文章

为啥文件中没有写入数据?

仅将Firebase分析重新路由到另一个帐户

为啥这不能检索 Firebase 存储上图像的下载 URL?

使用 Vue 将数据写入 Firebase

为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?

Firebase/Flutter - 无法将数据写入数据库