如何解决NetSuite Restlet超时限制问题



现在我第一次使用NetSuite Restlet。我从savedSearch中检索到以下数据。

{
"recordType": "receipt",
"id": "sample-id",
"values": {
"customer.customerid": "sample-id",
"customer.customercompany": "sample-customercompany", 
"customer.addressone": "sample-addressone",
"customer.addresstwo": "sample-addresstwo",
"customer.addresscity": "sample-addresscity",
"customer.addressstate": "sample-addressstate",
"country": "Australia",
"transacitionrecordid": "sample-id",
"unit": "Dollar",
"total": "120"
}
}

我必须循环结果集,将每个记录推送到数组中,并在最后返回数组。没有可以丢弃的字段。必须包括所有字段。

问题是,记录的数量大约为31000条。当我运行脚本时,执行时间超过5分钟,这是Restlet执行时间限制。这是我的剧本。

define(['N/search'], function(search) {
function get(event) {
var saved = search.load({ id: "search-id" });
var searchResultSet = saved.run();

var results = [];
var start = 0;

do {
searchRecords = searchResultSet.getRange({ start: start, end: start + 1000 });
start = start + 1000;
results.concat(searchRecords);
} while(results.length);
return JSON.stringify(results); // return as string for now to see the output on browser
}

return {
get: get
};
})

这就是我的剧本。

理想情况下,我调用这个脚本一次,然后返回全部31000条数据记录。

但是,由于执行限制,我正在考虑传递一个参数(用作指针?索引?光标(,并将此变量作为起始索引传递给getRange函数。我已经测试过了,我可以调用10000条记录。因此,通过传递0、10000、20000这样的参数来调用此脚本3次。

但是,有什么更好的方法来解决这个问题吗?我真正想要的是只调用这个脚本一次,并返回31000条记录,而不存在超时问题。

我能有什么建议吗?事先非常感谢。

听起来您需要一个map reduce脚本类型。我不确定您试图实现的总体结果是什么,但一般来说,MapReduce脚本是为处理大量数据而制作的。

脚本可以被调度,也可以使用N/Task触发它(如果你想从RESTLET触发它,这似乎是你需要的(

MapReduce脚本有4个本机函数。每个函数在每次触发时都有自己的使用限制,这使得它非常适合处理这样的大量数据。第一个用于生成数据集(您可以返回搜索:return search.create({}((第二个用于对数据进行分组-每个搜索结果将运行一次。第三个是对数据执行代码——它将为上一个函数传递的每个唯一键运行一次。四是对剧本进行总结。你可以在这里捕捉错误等

对于第一个要查询的函数来说,31k个结果可能太大,在这种情况下,您可以将其拆分为多个部分。例如,获取多达5k个结果,然后在汇总中检查是否还有更多的结果需要处理,如果有,则再次触发脚本(要做到这一点,您需要多次部署,并在事务上标记一个标记,以告诉您它已更新,或者一个全局字段,用于保存处理的最后一块数据(

您可以

  1. 将其分为较小的批次如果您仍然想使用Restlet来完成这项工作,请接收较小数量的记录
  2. 将接收到的数据写入自定义记录LONG TEXT字段JSON字符串,如果这些数据超过1000000个字符,并且有一个map reduce处理这些记录。3.创建一个MAP/Reduce TASK,并传递部署参数中的字符串数据。如果一个部署不够,则可以有多个部署

如果您的目的(我还没有清楚地理解(是调用Restlet从NS检索数据,那么只需添加分页。

第1页可以是0-1000第2页可以是第1页结束+1000,并且在来自restlet的每个响应中只提供结果总数和页面总数。这样,在调用restlet的应用程序中,您可以简单地进行循环,从每个页面收集所有结果。

最新更新