【问题标题】:Google App Maker saving records to DB is taking 240ms per recordGoogle App Maker 将记录保存到数据库每条记录需要 240 毫秒
【发布时间】:2019-03-29 22:36:09
【问题描述】:

我们正在开发一个使用 Google Cloud SQL 表的 Google App Maker 应用。我们位于中欧的布拉格,保存一条记录至少需要难以置信的 240 毫秒。

Google 应用制作工具似乎在我的位置附近有一个代理(延迟约 20 毫秒)。然而,我们在 US-Central1 中设置的实例(Google 推荐它为 Google App Maker 应用提供最佳性能)显示 ~120ms ping。

我们尝试了很多方法,包括将实例位置更改为德国法兰克福(约 25 毫秒)。在这种情况下,它需要更长的时间(每条记录 500 毫秒)。我们的查询似乎以这种复杂的方式往返: 我们的位置(代理)→ 美国(Google App Maker master)→ 法兰克福(SQL 实例)

我们非常绝望,因为目前我们无法从 Google 应用制作工具中迁移出去。而且我坚信这在现在或将来都有一些解决方案。

我的资源: db-f1-micro(vCPU:1),内存:614.4 MB,存储容量:10 GB 数据库版本:MySQL 2nd Gen 5.7,实例区:us-central1-a 连接性:公共 IP,我的位置:捷克共和国布拉格

function serverSaveData() {  
  var recordData = [];
  recordData[0] = ['NewField_String']
  recordData[1] = ['NewField1_String'];

  for (var i = 0 ; i < recordData.length; i ++) {
    var newProduct = app.models.testDB.newRecord();
    newProduct.NewField = recordData[i][0];
    newProduct.NewField1 = recordData[i][1];
    var time = new Date().toString();
    app.saveRecords([newProduct]);
    console.log('Product saved: ' + time);
  }

}

我们需要速度最大为每条记录约 25 毫秒(实际速度的十分之一)。我们有 10000 种产品,导入应该不会超过几分钟。

请问你们有什么解决方案,或者有没有办法将记录批量保存到数据库中?非常感谢!

【问题讨论】:

  • 这个延迟问题似乎是您的 SLA 或 GS​​uite 联系人代表应该能够与您一起解决的问题。如果您为服务付费,不要满足于被推荐给一群不为您付费的人工作的随机志愿者。

标签: google-cloud-sql google-app-maker


【解决方案1】:

应用制作工具有起有落,您只需要找到解决方法。我刚刚处理了一个包含超过 50 万条记录的大型数据库的导入,这是一个相当大的挑战。

在您的情况下,我建议您分批保存项目以加快处理速度。我认为分批保存2000条记录应该足够了。

你可以这样做:

function saveData(){

    //get the data
    var data = getData();

    var totalRecords = data.length;
    var batchLimit = 2000;
    var totalRounds = Math.ceil(totalRecords / batchLimit);
    var round = 1;
    var roundlimit = batchLimit;
    var currentItem = 0;

    do{
        var recordsToSave = [];
        for(var i=currentItem; i<roundlimit; i++){
            var recordData = data[i];
            var newProduct = app.models.testDB.newRecord();
            newProduct.newField = recordData.newFielddData;
            newProduct.newFiled2 = recordData.newField2Data;
            recordsToSave.push(newProduct);
        }
        if(recordsToSave.length){
            app.saveRecords(recordsToSave);
        }
        currentItem += batchLimit;
        roundlimit += batchLimit;
        round++;

    } while(round <= totalRounds);

}

我使用与上述类似的解决方案来完成将 680,000 多条记录导入 appmaker。它可能需要更多的调整,但你明白了。至于连接的延迟,对不起,我无能为力。希望 Google App Maker 工程师可以参与进来,但就我现在所见,这是您最好的选择。

【讨论】:

  • 了不起的人!太感谢了!这工作很快!您能帮我们实现批量编辑记录吗?假设数据库中的 newField 是唯一键(产品代码),我们想要更改此产品的可用性(newField2)。因此,我们需要将数组的数据每行链接到 DB 的数据行(使用产品代码)。 array[i][0] 是产品代码。再次感谢!
  • @DanielKacko 感谢您的感谢。首先,如果答案有帮助,请考虑将其标记为已接受,因为这对其他人也有帮助。其次,我建议您提出一个新问题并将其发布,最后,一旦我有时间,我会尽力帮助您。
  • 你是对的!再次感谢!我将提出一个新问题。我认为对于每个在美国以外使用 Google 应用制作工具的初学者来说,这是一个非常有用的话题。
  • @Morfinismo 我测试了这个批处理解决方案,但看不到明显的速度提升。您能否解释一下为什么这种批处理方法应该加快 newRecord 的操作速度,因为所有代码都以同步方式运行(每个批处理开始直到前一个完成)?提前致谢。
  • @Albert 我不知道你的情况,但在 OP 的情况下,他正在为每条记录保存记录,这需要更多时间。
猜你喜欢
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多