【问题标题】:NetSuite restlet write performance is poorNetSuite restlet 写入性能差
【发布时间】:2018-01-08 23:24:39
【问题描述】:

编辑:我已经编辑了实际数字并用伪誓言替换了它们,因为我被告知共享性能数据违反了 Netsuite 的 TOS。

我正在使用 restlets 将我们的会计系统与 NetSuite 集成,总体而言,除了性能方面的明显例外,它运行良好。从性能的角度来看,我已经发现 nlapiLoadRecord 是撒旦自己的孩子,所以我尽可能避免使用它来支持搜索 api,现在我的读取 restlets 非常活泼。然而,每当我让一个休息者写任何东西时,它就像一只被困在冷焦油中的乌龟一样慢。我通常在 SLOWREALLY DAMN SLOW 秒之间分析 nlapiSubmitRecord 本身。这对我来说似乎很疯狂。如果编写性能总是这么差,没有人会使用 NetSuite。我将在下面包含几个代码示例。任何有关加快 NetSuite restlet 写入性能的提示都将不胜感激。

在第一个中 receivedInvoice 是传入数据,findCurrencyCode 和 findCustomerByCustomerNumber 是执行这些操作的良好函数。我刚刚在一个几乎令人难以置信的 HOLY MONKEYS 太慢 秒内完成了一张简单的发票,其中包含一个行项目,几乎所有时间都在等待 nlapiSubmitRecord 完成。

var createdInvoice = nlapiCreateRecord('invoice');

createdInvoice.setFieldValue('customform', Number(receivedInvoice.transactionType));
createdInvoice.setFieldValue('memo', receivedInvoice.message);
createdInvoice.setFieldValue('duedate', receivedInvoice.dateDue);

createdInvoice.setFieldValue('currency', findCurrencyCode(receivedInvoice.currencyUnit));
createdInvoice.setFieldValue('location', Number(receivedInvoice.location));
createdInvoice.setFieldValue('postingperiod', findPostingPeriod(receivedInvoice.datePosted));
var customer = findCustomerByCustomerNumber(receivedInvoice.customerNumber);

createdInvoice.setFieldValue('entity', customer.customerId );
createdInvoice.setFieldValue('custbody_end_user', customer.customerId );
createdInvoice.setFieldValue('department', customer.departmentId);

var itemCount = receivedInvoice.items.length;
for(var i = 0; i < itemCount; i++)
{
  createdInvoice.selectNewLineItem('item');
  createdInvoice.setCurrentLineItemValue('item', 'item',receivedInvoice.items[i].item);
  createdInvoice.setCurrentLineItemValue('item', 'quantity', receivedInvoice.items[i].quantity);
  createdInvoice.setCurrentLineItemValue('item', 'rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'custcol_list_rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'amount',receivedInvoice.items[i].totalAmount);
  createdInvoice.setCurrentLineItemValue('item', 'description',receivedInvoice.items[i].description);
  createdInvoice.commitLineItem('item');
}

var recordNumber = nlapiSubmitRecord(createdInvoice,false,true);

在这一个中,我认为我通过在动态模式下打开记录来犯下性能异端,但我不确定如何获得可能的订单项。只需在 SLOW 秒左右以动态模式打开新记录。同样,提交是消耗时间最多的地方(通常在 OH DEAR SWEET MOTHER OF HORRIBLE 秒左右),尽管由于我弄乱了订单项,这一次消耗了相当多的时间,大概是因为我已经以动态模式打开了记录。

var customerPayment = nlapiCreateRecord('customerpayment',{recordmode: 'dynamic'});

customerPayment.setFieldValue('customer', parseInt(customerId));
customerPayment.setFieldValue('payment', paymentAmount);
customerPayment.setFieldValue('paymentmethod', paymentMethod);
customerPayment.setFieldValue('checknum', transactionId);
customerPayment.setFieldValue('currency', currency);
customerPayment.setFieldValue('account', account);

var applyCount = customerPayment.getLineItemCount('apply');

if(applyCount>0)
{
    for(var i=1;i<=applyCount;i++)
    {
        var thisInvoice = customerPayment.getLineItemValue('apply','refnum',i);

        if(thisInvoice == invoiceToPay)
        {
            customerPayment.selectLineItem('apply', i);
            customerPayment.setCurrentLineItemValue('apply','apply','T');
            customerPayment.setCurrentLineItemValue('apply', 'amount',paymentAmount);
            customerPayment.commitLineItem('apply');
        }
    }

}
nlapiSubmitRecord(customerPayment,false,true);

【问题讨论】:

  • 谢谢你的伪誓——他们让我哈哈大笑。另外:分享性能违反了他们的服务条款......?这是 NetSuite 默许他们的表现惨不忍睹?
  • 不幸的是,公司这样做似乎并不少见:stackoverflow.com/questions/12115397/…
  • Powercow,你曾经解决过你的性能问题吗?您是在 Netsuite 的沙盒环境还是生产环境中进行了测试?在生产环境中性能是否更好?
  • 问题依然存在。我使用了各种技巧来更快地获得写入性能,但以任何标准衡量,性能仍然很糟糕且无法接受。尽管生产环境比沙盒环境执行得更好,但如果它在生产中不是问题,我就不会在这里。在这一点上,在与 NetSuite 的支持人员进行了广泛的交谈后,我相信 NetSuite 的写入性能非常糟糕,您只能期望要么异步写入并稍后处理错误,要么接受糟糕的性能。认为这是一种强烈的反背书。

标签: javascript performance netsuite suitescript


【解决方案1】:

提交速度慢的原因之一可能是记录中附加了很多用户事件脚本。由于保存记录的是Restlet,所以会触发用户事件脚本。

【讨论】:

  • 虽然我的发票确实附加了很多用户事件,但关闭它们似乎并不能节省大量提交时间。我经历并将它们全部更改为未部署以进行测试,并且没有看到巨大的时间差异,尽管很难确定,因为即使系统不忙(提交时间)保存发票也有很大的差异范围在沙盒系统上全天保存相同数据时变化 100%)。
【解决方案2】:

一些想法:

  1. (只是为了摆脱我的胸膛)将您的会计系统与 Netsuite 集成听起来很奇怪。 Netsuite 是一个会计系统,通常是使用它的组织的记录会计系统。如果您不使用 Netsuite 进行会计核算,您可能需要考虑一下它在价格上具有哪些实用性,然后放弃它。
  2. 当我将外部系统与 Netsuite 集成时,我通常会尝试使其异步。为此,我将原始信息放入自定义记录中,然后启动预定脚本来处理排队更新。这让我的 api 快速返回。当我处理队列时,我将错误存储在队列记录中,以便如果出现任何问题,我可以修复数据或代码并重新提交。
  3. 缓慢事务提交(除了缓慢的 UE 脚本)的一个明显主要来源是您的帐簿状态。我有一个创业客户做得很好,但他们从未结账,他们使用的是 IIRC 平均成本法。每次他们保存发布交易时,Netsuite 都会重新计算整个周期(在事情陷入停顿的时候,对于一个非常繁忙的站点来说,大约是 2 年的记录)。当他们开始关闭时段时,交易保存时间大大减少。当他们转换为标准成本计算时,交易节省时间再次下降(我想 LIFO 会比 Avg 快,比标准慢,但 YMMV)

还有关于您的代码的注释。

创建发票的正常方式是

nlapiTransformRecord('customer', customer.customerId, 'invoice');nlapiTransformRecord('customer', customer.customerId, 'invoice', {recordmode:'dynamic'});

我从未测试过这是否对提交时间有影响,但它可能会有所帮助,因为 NS 会从稍微更好的地方开始保存(抓住稻草,但 NS 有时不明显的变化会带来速度优势)

也不确定如何在动态模式下更改自定义表单。当您知道表单时,您还可以将其添加到初始化默认值中:

{recordmode:'dynamic', customform:receivedInvoice.transactionType}

【讨论】:

  • 感谢您的意见。通过“在没有会计系统的情况下集成”,我想我有点不清楚 - 我的意思是将它与我​​们的财务团队用来记录会计事件的工具集成。 NetSuite 是记录会计系统,但我们有各种会计工具/前端/您有什么提交会计数据。我想我应该说“将 NetSuite 集成到我们的会计生态系统”之类的话。感谢您提供有关使用转换创建发票的提示。我会看看这是否会改变性能。
  • 使用转换确实使提交速度更快,但使记录创建时间更长,因此总体方法执行时间大致相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2016-11-16
相关资源
最近更新 更多