Firebase:创建FIFO库存以获得价值

时间:2017-06-07 05:15:52

标签: node.js firebase firebase-realtime-database google-cloud-functions

我一直坚持这个问题一个月。

我一直在尝试使用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秒内完成时,问题就出现了,数据存储插入还没有持久化。

还有其他任何头脑风暴的想法吗?

0 个答案:

没有答案