【问题标题】:Mule 4 : Memory Management : how to manage variables having huge data for example 300 Mb?Mule 4:内存管理:如何管理具有大量数据的变量,例如 300 Mb?
【发布时间】:2020-09-02 13:53:39
【问题描述】:

我正在开发一个 mule 应用程序,该应用程序从数据库中获取数十万条记录,使用 dataweave 进行映射以更改传入记录的结构并将数据插入 Salesforce。我遵循的步骤是:

  1. 一次从 db 中获取所有记录 (> 100k) 并将其存储在 mule 变量“vars.fetchedRecords”中
  2. 为每个组件使用 10k 批量处理这些“fetchRecords”
  3. 在每个内部,我都使用 Dataweave 转换器,我使用 var 来保存新的映射对象列表

如何优化这个过程?在变量中保存这么多记录会影响应用程序的性能吗?有没有更好的方法?

【问题讨论】:

  • 使用批处理作业docs.mulesoft.com/mule-runtime/4.3/batch-processing-concept,for-each 是顺序的,单线程的,批处理是并行的,多线程的。
  • 好的。我会尝试。另一个问题:mule 将 vars 存储在 RAM 或 Disk Storage 的什么位置?
  • 变量存储在 RAM 中。

标签: dataweave mule4


【解决方案1】:

看起来没有必要在内存中保留记录。你只需要处理它们。对吧?

其中一种方法是使用水印。标记您在数据库中所做的操作,然后再处理其余部分。 Mule 内置了 capabailiteis 来处理水印。 https://docs.mulesoft.com/connectors/object-store/object-store-to-watermark

更简单的方法(仍然分步处理记录)是找出一些顺序(例如时间),按此顺序处理某个子集(例如一年),然后根据您已有的数据开始下一步转移到目的地。这是更好的方法,因为如果过程失败,您可以稍后根据已经传输的数据继续它。这样的分页过程可以随着时间、服务器、多线程分布。

节省内存的最佳方法不是使用变量,而是使用有效负载。默认情况下,Mule 的有效负载是一个流,因此实际上数据有多大并不重要——它会自动流过流处理的针耳。尽量避免将流的一小部分存储在变量/内存中。最终这个存储会溢出。

【讨论】:

  • 嗨@Alex,我每次从源数据库中获取特定大小的记录,比如 100 条记录,处理这些记录,保存数据并清除变量,然后再获取下一批。这是实现分页技术的正确方法吗?
  • 最重要的是我想了解的是 Mule 应用程序从数据库中检索数据并将其存储在 vars 中时的内存使用情况。变量是存储在 RAM 还是磁盘存储中?我们可以通过使用 Remove Variable Transformer 删除变量来释放内存吗?
  • 是的,获取和处理记录集是正确的方法。其次 - 尽量避免将数据存储在变量中 - 它们在内存中。使用有效负载 - 它作为流传输,因此它只是部分在内存中 - 只有一小部分。第三 - 确保您可以使用通常在流程结束或其他范围(如 for-each 内部)自动完成的 Remove Variable nut。同样,更好地使用流,顺便说一句,它们在 Mule 中是默认的。 Jusy 不要使用变量。
  • Alex 在谈到流时在说什么,这与记忆有很大关系:docs.mulesoft.com/connectors/db/…
  • 感谢 Alex 的建议。我会尝试这些来提高性能。
猜你喜欢
  • 2011-05-15
  • 2020-08-19
  • 1970-01-01
  • 2011-11-10
  • 2021-08-31
相关资源
最近更新 更多