【问题标题】:Persisting data across SuiteScript 2.0 map/reduce stages跨 SuiteScript 2.0 map/reduce 阶段持久化数据
【发布时间】:2019-02-25 18:57:50
【问题描述】:

我一直在努力反对这个想要的功能,但我似乎在任何 NS2.x 文档中都找不到它。

我想跨 map/reduce 架构中的多个阶段保留脚本运行时数据。例如:getInputData阶段的开始时间、处理的记录数、配置数据等。

但是,所有功能似乎都旨在防止这种情况发生。其中大部分(例如配置数据)我已经放入缓存存储(通过 N/cache 接口),但这会带来一些问题,例如缓存在运行的脚本实例之间持续存在,这将使用过时的或其他部署配置.我必须创建一个日期/时间戳+用户的每个会话密钥,以在必要时保持唯一性。

N/runtime 模块中有一个 Session 对象,但这会在各个阶段之间将其自身屏蔽掉,因此它不会在真正的执行实例范围内运行——这就是我所期望的“会话”。我已经使用调试跟踪验证了这一点,该跟踪显示 Session 对象在 getInputData() 阶段结束时为非空白,但在到达 summary() 阶段时完全为空。即使写到 summaryContext 似乎也没有用或有帮助,因为那里只能写简短的摘要数据。

任何帮助(或指向已回答的问题)都会很有用;我似乎在 NetSuite 帮助论坛或 StackOverflow 上的任何地方都找不到这个讨论。

【问题讨论】:

  • 我应该指出,缓存数据只能将可重复的数据创建作为其内容的一部分。这意味着其中大部分将基于记录搜索或从中派生的数据,而不是基于阶段范围的信息,例如时间戳或记录计数。这就是为什么缓存不能用于所有信息的原因,因为它可能会被删除并且需要由脚本根据需要重新创建。
  • 我遇到了几乎同样的问题,我的建议是:你需要停止思考“坚持”这个概念,因为就像你说的那样,这可能是不可能的。这并不意味着您找不到问题的解决方案,您只需要开始思考如何使用可用的选项来解决它:这是我一直在做的事情,而且它有效。如果您愿意,只需更新问题以说明您想要做什么,我们可以帮助建议正确的架构。
  • 事实证明,我要查找的大部分数据已经在 summaryContext 对象中了。就像“机会”一样。
  • 但这只是不可能的,因为 Oracle 对这个用例有些盲目。由于缺少此功能,我不得不通过以下方式进行补偿: 1)让启动 Suitelet 创建一个唯一键以供以后分组并将其作为参数传递; 2) 在map() 和reduce() 阶段之间传递一些不受欢迎的复杂结构; 3) 在阶段之间删除一些与字段相关的功能使用,因为记录对象被折叠为 JavaScript 对象
  • 是的,我理解你的沮丧,我也去过那里,但公平地说(扮演魔鬼的拥护者:)):1. 这不是预言机问题,Map/Reduce 在 Netsuite 出现之前就已经存在被甲骨文收购。 2. 我认为这与 Map/Reduce 阶段被设计为并行运行的事实有关(如果您的 Netsuite 帐户中有多处理器):因此在 Maps/Reduce 之间传递一些数据可能会很棘手 + 如果一个事实进程失败,它不会影响其他进程,它会自动重新运行......所以完全分离这些“执行”是一种义务。

标签: javascript mapreduce netsuite suitescript suitescript2.0


【解决方案1】:

为什么不使用 N/file 将您想要的内容存储在文档中?我的意思是它很昂贵,但应该没有任何冲突。

【讨论】:

  • 这将需要在每个 map() 和 reduce() 调用中读取文件,在我的情况下没有帮助。我正在切换到 SS 2.x 以通过并发提高可用性能,并且读取文件只会减慢速度,因为它会在每个记录过程中发生。
猜你喜欢
  • 2011-07-29
  • 2012-08-14
  • 2015-04-08
  • 2021-03-25
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多