Mule 4:内存管理:如何管理具有大量数据(例如 300 Mb)的变量?

Mule 4 : Memory Management : how to manage variables having huge data for example 300 Mb?

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

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

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

看来不需要在内存中保留记录了。你只需要处理它们。对吗?

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

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

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