gpt4 book ai didi

performance - 如何清除 Firebase 实时数据库中的旧内容

转载 作者:行者123 更新时间:2023-12-01 03:18:43 25 4
gpt4 key购买 nike

我正在使用 Firebase 实时数据库,超时时其中有很多陈旧数据,我编写了一个脚本来删除陈旧内容。

我的节点结构如下所示:

store
- {store_name}
- products
- {product_name}
- data
- {date} e.g. 01_Sep_2017
- some_event

数据规模
#Stores: ~110K
#Products: ~25

语境

我想清理所有 30 个月前的数据。我尝试了以下方法:-

For each store, traverse all the products and for each date, delete the node



我运行了大约 30 个线程/脚本实例,每个线程负责删除该月特定日期的数据。整个脚本运行约 12 小时以删除具有上述结构的月份数据。

我对每个脚本中挂起的调用数量设置了限制/上限,从日志记录可以看出,每个脚本都很快达到限制,并且触发删除调用的速度比删除速度快得多,所以这里 firebase 成为瓶颈.

很明显,我在客户端运行清除脚本,为了获得性能脚本应该在靠近数据的地方执行以节省网络往返时间。

问题

一季度。如何有效地删除firebase旧节点?

Q2。有没有办法在每个节点上设置一个 TTL 以便它自动清理?

Q3。我已从多个节点确认数据已从节点中删除,但 Firebase 控制台未显示数据减少。我还尝试备份数据,但它仍然显示一些我手动检查节点时不存在的数据。我想知道这种不一致背后的原因。

firebase 是否进行软删除所以当我们进行备份时,数据实际上在那里,但通过 firebase sdk 或 firebase 控制台看不到,因为它们可以处理软删除但备份不能?

第 4 季度。在我的脚本运行的整个过程中,我的带宽部分不断增加。使用下面的脚本,我只触发删除调用,我没有读取任何数据,但我仍然看到与数据库读取的一致性。看看这个截图?

enter image description here

这是因为已删除节点的回调吗?

代码
var stores = [];
var storeIndex = 0;
var products = [];
var productIndex = -1;

const month = 'Oct';
const year = 2017;

if (process.argv.length < 3) {
console.log("Usage: node purge.js $beginDate $endDate i.e. node purge 1 2 | Exiting..");
process.exit();
}

var beginDate = process.argv[2];
var endDate = process.argv[3];

var numPendingCalls = 0;

const maxPendingCalls = 500;

/**
* Url Pattern: /store/{domain}/products/{product_name}/data/{date}
* date Pattern: 01_Jan_2017
*/
function deleteNode() {
var storeName = stores[storeIndex],
productName = products[productIndex],
date = (beginDate < 10 ? '0' + beginDate : beginDate) + '_' + month + '_' + year;

numPendingCalls++;

db.ref('store')
.child(storeName)
.child('products')
.child(productName)
.child('data')
.child(date)
.remove(function() {
numPendingCalls--;
});
}

function deleteData() {
productIndex++;

// When all products for a particular store are complete, start for the new store for given date
if (productIndex === products.length) {
if (storeIndex % 1000 === 0) {
console.log('Script: ' + beginDate, 'PendingCalls: ' + numPendingCalls, 'StoreIndex: ' + storeIndex, 'Store: ' + stores[storeIndex], 'Time: ' + (new Date()).toString());
}

productIndex = 0;
storeIndex++;
}

// When all stores have been completed, start deleting for next date
if (storeIndex === stores.length) {
console.log('Script: ' + beginDate, 'Successfully deleted data for date: ' + beginDate + '_' + month + '_' + year + '. Time: ' + (new Date()).toString());
beginDate++;
storeIndex = 0;
}

// When you have reached endDate, all data has been deleted call the original callback
if (beginDate > endDate) {
console.log('Script: ' + beginDate, 'Deletion script finished successfully at: ' + (new Date()).toString());
process.exit();
return;
}

deleteNode();
}

function init() {
console.log('Script: ' + beginDate, 'Deletion script started at: ' + (new Date()).toString());

getStoreNames(function() {
getProductNames(function() {
setInterval(function() {
if (numPendingCalls < maxPendingCalls) {
deleteData();
}
}, 0);
});
});
}

PS:这不是我拥有的确切结构,但它与我们拥有的非常相似(我更改了节点名称并试图使示例成为现实示例)

最佳答案

  • 是否可以更有效地完成删除取决于您现在如何进行删除。由于您没有分享 minimal code that reproduces your current behavior很难说如何改进它。
  • 不支持文档上的生存时间属性。通常,开发人员在定期运行的管理程序/脚本中进行清理。运行清理脚本的频率越高,它需要做的工作就越少,因此速度也会越快。

    另见:
  • Delete firebase data older than 2 hours
  • How to delete firebase data after "n" days
  • 当您告诉 Firebase 时,它​​实际上会从磁盘中删除数据。没有办法通过 API 来检索它,因为它真的消失了。但是,如果您有前一天的备份,那么数据当然仍然存在。
  • 关于performance - 如何清除 Firebase 实时数据库中的旧内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47437885/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com