我一直坚持这个问题一个月。
我一直在尝试使用firebase来创建FIFO库存。我正在使用firebase云功能来更新FIFO库存。但是,如果我使用for循环对insert(push)和remove(pop)进行10次压力测试以下代码,则会因为并发更新而中断。
有没有人为此提供其他解决方案?
插入FIFO / PUSH:
let fifoRef = admin.database().ref('fifo/' + item.itemId + '/').push();
let fifo = {
price: data.items[uniqueId].price,
in: data.items[uniqueId].quantity,
quantity: data.items[uniqueId].quantity,
}
fifoRef.set(fifo);
获取FIFO值/ POP(这里我只是更新POP的数量):
// get fifo
let fifoReference = 'fifo/' + item.itemId;
let fifoRef = admin.database().ref(fifoReference);
fifoRef.once('value').then(currentData => {
let fifo = currentData.val();
for (let key in fifo) {
let val = fifo[key];
if (val.quantity > 0) {
// get fifo quantity
let fifoQuantityRef = admin.database().ref(fifoReference + '/' + key + '/quantity/');
// get local cache value
let fifoQuantityListener = fifoQuantityRef.on('value', () => {
// transaction start
fifoQuantityRef.transaction(function (quantity) {
if (quantity) {
if (quantity > 0 && quantitySubtotal > 0) {
if (quantity >= quantitySubtotal) {
// minus inventory amount
let amount = calculator(quantitySubtotal + "*" + val.price);
quantity = calculator(quantity + "-" + quantitySubtotal);
quantitySubtotal = 0;
// update quantity
return quantity;
} else {
let amount = calculator(quantity + "*" + val.price);
quantitySubtotal = calculator(quantitySubtotal + "-" + quantity);
return 0;
}
}
}
return quantity;
}, (error, committed, result) => {
fifoQuantityRef.off('value', fifoQuantityListener);
}, true);
});
头脑风暴: 我只需要了解如何使用FIFO获取VALUE。根据我的理解,Firebase最好用于插入和删除不用事务。但如果我只使用插入和删除,如何创建一个FIFO?如果我创建数量为1的FIFO,则存储的数据将太大。
我确实尝试使用Google Datastore,但数据存储持久性非常慢(写入时间超过2秒)。哪个不可能与持续时间小于1秒的firebase一起使用。当PUSH和POP在1秒内完成时,问题就出现了,数据存储插入还没有持久化。
还有其他任何头脑风暴的想法吗?